首頁  >  文章  >  後端開發  >  Python新手們容易犯的幾個錯誤總結

Python新手們容易犯的幾個錯誤總結

Y2J
Y2J原創
2017-04-20 09:11:021800瀏覽

python語言裡面有一些小的坑,特別容易弄混弄錯,初學者若不注意的話,很容易坑進去,下面我給大家深入解析一些這幾個坑,希望對初學者有所幫助,需要的朋友可以參考學習,下面來一起看看吧。

前言

這篇文章主要給大家總結了關於學習Python的新手們容易犯的幾個錯誤,一共四個易犯錯,下面來看看詳細的介紹吧。

一、i+=1 不等於++i

#初學者對Python語言不是特別了解的話,又正好有c++,java的語言背景,很容易把++i和i+=1弄混

先來看一個小例子:


##

i=0
mylist=[1,2,3,4,5,6]
while i <len(mylist):
 print(mylist[i])
 ++i

這段程式碼會想當然的認為,沒有啥問題啊,一個循環輸出,i不斷的+1,蠻對的呀.其實不是的,這個代碼會

一直輸出1,一個死循環.因為Python的解釋器會將++i操作為+(+i) .其中+表示是正數符號,對於--i也是類似的.


print(+1)
>>>1
print(++1)
>>>1
print(+++1)
>>>1

這下明白了++i雖然在Python語法是合法的,但是並不是我們理解的

自增的操作.

二、分清楚==和is的用法

在判斷字串是否相等的時候,初學者特別會弄混is和==,這樣的結果是程式在不同的情況下表現不同:

例如先看一個簡單的例子:


a=&#39;Hi&#39;
b=&#39;Hi&#39;
print(a is b)
>>>True
print(a==b)
>>>True #看起来is和==好像是一样的

我們再看第二個範例:


str1=&#39;Wo shi yi ge chi huo&#39;
str2=&#39;Wo shi yi ge chi huo&#39;
print(str1 is str2)
>>>False#is的结果是False
print(str1==str2)
>>>True #==的结果为True,看二者不一样了吧

第三個範例


str3=&#39;string&#39;
str4=&#39;&#39;.join([&#39;s&#39;,&#39;t&#39;,&#39;r&#39;,&#39;i&#39;,&#39;n&#39;,&#39;g&#39;])
print(str3)
>>>string
print(str3 is str4)
>>>False #is的结果是False
print(str3==str4)
>>>True #==的结果为True,看二者不一样了吧

這就是很容易混淆初學者的地方,感覺很奇怪,為什麼有的時候is和==輸出相同,有的時候不同呢。好我們來一探究竟:

我們用內置的

id()這函數,這個函數用來傳回物件的記憶體位址,查一下就清楚了

Python新手們容易犯的幾個錯誤總結

is是物件的標示符,用來比較兩個物件的

記憶體空間是不是一樣,是不是用的同一塊空間位址,而==是比較兩個物件的內容是否相等.

三、連接字串特別是大規模的字串,最好用join 而不是+##字串處理的時候,最常用的是連接,Python中的字串與其他的語言有一點不同,它是不可變對象,一旦創建不能改變.而這個特性直接會影響到

Python中字符串連接的效率

.

用+連接字串:

#

str1,str2,str3=&#39;test&#39;,&#39;string&#39;,&#39;connection&#39;
print(str1+str2+str3)
>>>test string connection

#用join連接字串


str1,str2,str3=&#39;test &#39;,&#39;string &#39;,&#39;connection&#39;
print(&#39;&#39;.join([str1,str2,str3]))
>>>test string connection

但是若是連接大規模的字串,比如要連接10萬左右的字串的時候,join的方法效率就會快很多(甚至相差百倍).比如下面這10萬個字串連接.


long_str_list=[&#39;This is a long string&#39; for n in range(1,100000)]

原因是因為若要連接字串:S1+S2+S3+....+SN,由於字串是不可變的對象,執行一次就要申請一塊新的內存,這樣的話在N個字符串連接的過程中,會產生N-1個中間結果,每產生一個中間結果就要申請一次內存,這樣會嚴重影響執行效率.

而join不一樣,它是一次性申請總的內存,然後把字符串裡面的每一個元素複製到內存中去,所以join會快很多.

因此,字串的連接,尤其是大的字串處理,最好用join

#四、不要在for 和while 迴圈後面寫else 區塊

Python 提供了許多程式語言都不支援的功能,那就是可以在迴圈內部的語句區塊後面直接寫else 區塊。例如:


for i in range(3):
 print(&#39;Loop %d&#39;%i)
else:
 print(&#39;Else block&#39;)
>>>Loop 0
>>>Loop 1
>>>Loop 2
>>>Else block
  • 這種else 區塊會在整個迴圈執行完之後立刻執行。既然如此,那它為什麼叫做else 呢?為什麼不叫and ?在if/else 語句中,else 的意思是:如果不執行前面那個if 區塊,那就執行else 區塊。

  • 同理try/except/else 也是如此,該結構的else 的意思是:如果前面的try 區塊沒有失敗,那就執行else 區塊。

  • try/finally 同樣非常直觀,這裡的finally 的意思是:執行過前面的try 區塊之後,不管如何總是執行finally區塊。

問題來了對於剛接觸Python 的程式設計師可能會把for/else 結構中的else 區塊理解為:如果迴圈沒有正常執行完,那就執行else塊

其實剛好相反-在迴圈裡用break語句提前跳出,會導致程式不執行else 區塊,這一點會有點繞.對於不熟悉for/else 的人來說,會令閱讀程式碼的人感到相當費解.

總結

#

以上是Python新手們容易犯的幾個錯誤總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn