Python中遇到的坑有哪些-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

十余年的隆陽(yáng)網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷型網(wǎng)站的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整隆陽(yáng)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“隆陽(yáng)網(wǎng)站設(shè)計(jì)”,“隆陽(yáng)網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

小編給大家分享一下Python中遇到的坑有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家學(xué)習(xí),希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去學(xué)習(xí)方法吧!

一、走丟的外部變量

首先我們先來看這么一個(gè)例子:

e = 429
try:
   raise Exception()
except Exception as e:
   pass
print(e)

PS:except Exception as e 可以捕獲除了與程序退出(sys.exit())相關(guān)之外的所有異常。

在繼續(xù)向下看之前,你可以先思考一下上述例子可能出現(xiàn)的結(jié)果是什么,也可以自己嘗試著在編譯器里輸入一下。思考完了請(qǐng)繼續(xù)往下看。

出現(xiàn)的結(jié)果如下:

Traceback (most recent call last):
 File "test.py", line 8, in <module>
   print(e)
NameError: name 'e' is not defined

竟然報(bào)錯(cuò)了,那么這到底是為什么呢?

其實(shí)這是因?yàn)樵?Python3 中使用 as 分配異常的時(shí)候,在 except 的末尾將會(huì)把這個(gè)異常清除掉(在 Python2 中則不會(huì)出現(xiàn)這樣的情況)。這就好像將上面的示例變成下面的樣子:

e = 429
try:
   raise Exception()
except Exception as e:
   try:
       pass
   finally:
       del e
print(e)

通過上面的變形代碼,我們可以很清楚的看明白發(fā)生這一切的根源是什么:因?yàn)?e 被刪除了。這也變相的告訴我們,如果想要在 except 后面引用 e,必須將它先賦值給其它變量。

這樣看來,是變量 e 執(zhí)行了 except 子句而被刪除,但是為什么 e 會(huì)去執(zhí)行 except 子句呢??jī)H僅是因?yàn)?e 和 as 后面的 e 長(zhǎng)的一毛一樣?

答案是否定的,其實(shí)這個(gè)是因?yàn)樽泳湓?Python 中沒有獨(dú)立的作用域,所以上述示例中的所有內(nèi)容都處于同一個(gè)作用域里,所以變量 e 會(huì)因?yàn)閳?zhí)行了 except 子句而被刪除。

二、同樣是加,卻不一定等價(jià)

在我們來表示「加」這個(gè)概念的時(shí)候,一般我們會(huì)用兩種方式:a = a + b或者是 a += b 。在很多人的概念里這兩個(gè)其實(shí)就是一種,不分彼此,比如之前我就是這么認(rèn)為的,直到有一天有人拿著下面的坑過來讓我踩...

首先我們先來看第一個(gè)例子:

>>> a = [1,2,3]
>>> b = a
>>> a = a + [4,5,6]

一個(gè)很簡(jiǎn)單的例子,你知道此時(shí)的 a 和 b 分別是多少么?請(qǐng)先自己思考一下再繼續(xù)向下看:

>>> a
[1, 2, 3, 4, 5, 6]
>>> b
[1, 2, 3]

估計(jì)很多人都會(huì)答對(duì),表達(dá)式 a = a + [4,5,6] ,等號(hào)右邊其實(shí)是形成了一個(gè)新的列表,最后讓 a 引用了這個(gè)新的列表,而 b = a 引用的是之前的 a,所以 b 保持不變。

明白了上面的例子,我們接下來再看一個(gè)稍微有點(diǎn)區(qū)別的例子:

>>> a = [1,2,3]
>>> b = a
>>> a += [4,5,6]

上面的例子和文章開頭的例子區(qū)別在從 + 變成了 +=,按照我們慣性思維去想,肯定以為這倆例子就是一個(gè)東西的兩種不同寫法而已,可實(shí)際上真的是這樣嗎?讓我們來看一下此時(shí)的 a,b:

>>> a
[1, 2, 3, 4, 5, 6]
>>> b
[1, 2, 3, 4, 5, 6]

咦?同樣是印象里的「加」,好像真的哪里有點(diǎn)不一樣誒。。

通過上面我們就可以看出 a = a + b 和 a += b 并不總是表現(xiàn)相同,起碼在列表上就是這么表現(xiàn)的。在這里的 a += [4,5,6] 實(shí)際上使用的是 extend 函數(shù),所以 a 和 b 仍然指向已被修改的同一列表。

既然在這里說到了 + 和 +=,索性再多補(bǔ)充一點(diǎn):在使用「加」的概念來連接字符串的時(shí)候,+= 其實(shí)比 + 的速度更快。

下面我們來實(shí)際的演示一下用 + 連接三個(gè)字符串:

>>> import timeit
>>> timeit.timeit("a = a + b + c", setup="a='a'*10000;b='b'*10000;c='c'*10000",number=100)
0.07921688999340404
>>> timeit.timeit("a += b + c", setup="a='a'*10000;b='b'*10000;c='c'*10000",number=100)
0.002059974998701364

上面的兩個(gè)結(jié)果很容易看出來,在處理速度上,+= 比 + 處理的速度要快的多。出現(xiàn)這樣現(xiàn)象的原因是 += 執(zhí)行的是追加操作,追加操作的話就會(huì)比 + 少了一個(gè)銷毀然后新建的動(dòng)作,比如在 a += b + c 上 a 就不會(huì)被銷毀。

三、不一般的小括號(hào)

很多學(xué)過別的編程語(yǔ)言的同學(xué),很容易會(huì)忽略小括號(hào) “()” 在 Python 中的一個(gè)重要表現(xiàn),那就是小括號(hào)還能表示“元組” 這一不可變數(shù)據(jù)類型。

>>> type(())
<class 'tuple'>
>>> tur = (1, 2)
>>> type(tur)
<class 'tuple'>

但是如果小括號(hào)內(nèi)只有一個(gè)元素的話,比如像下面這樣,它就是小括號(hào)內(nèi)的元素類型:

>>> tur = (1)
>>> type(tur)
<class 'int'>

天吶個(gè)天...

那么如果想要表示一個(gè)元素的元組咋整呢?要像下面這樣:

>>> tur = (1, )
>>> type(tur)
<class 'tuple'>

加個(gè)逗號(hào) “,” 就 ok 啦...

四、列表的刪除沒有那么簡(jiǎn)單

假如我們有一個(gè)列表,我想刪除列表中的元素:

>>> lst = [1, 2, 3, 4, 5]
>>> for i in lst:
... lst.remove(i)

在剛開始學(xué)習(xí) Python 之初,這是很多同學(xué)容易想到的做法,然而我們來看一下程序運(yùn)行完以后的結(jié)果:

>>> lst
[2, 4]

看到這個(gè)結(jié)果,我...

這是為啥子呢?是因?yàn)樵?for 循環(huán)中,如果我們刪除了 index = 0 (即 1)的值,原本 index = 1 及其之后的值會(huì)向前補(bǔ)位,所以當(dāng)前 index = 1 的值為之前 index = 2 的值。

列表的刪除操作我們經(jīng)常要用,所以大家要打起十二分的精神來對(duì)它。

五、is not 不分家

is not 在 Python 中是一伙的,用的時(shí)候要靠在一起,分開以后就是兩個(gè)東西,結(jié)果會(huì)不一樣。

>>> [1, 2, 3] is not None
True
>>> [1, 2, 3] is (not None)
False

這就在于,is not 是個(gè)單獨(dú)的二元運(yùn)算符,當(dāng)它兩側(cè)的變量指向同一個(gè)對(duì)象的時(shí)候,結(jié)果為 False,否則結(jié)果為 True,希望引起大家的注意。

以上是Python中遇到的坑有哪些的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!

本文題目:Python中遇到的坑有哪些-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://muchs.cn/article18/dsgdgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作、虛擬主機(jī)、網(wǎng)站維護(hù)、ChatGPT網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化