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='Hi' b='Hi' print(a is b) >>>True print(a==b) >>>True #看起来is和==好像是一样的
我們再看第二個範例:
str1='Wo shi yi ge chi huo' str2='Wo shi yi ge chi huo' print(str1 is str2) >>>False#is的结果是False print(str1==str2) >>>True #==的结果为True,看二者不一样了吧
第三個範例
str3='string' str4=''.join(['s','t','r','i','n','g']) print(str3) >>>string print(str3 is str4) >>>False #is的结果是False print(str3==str4) >>>True #==的结果为True,看二者不一样了吧這就是很容易混淆初學者的地方,感覺很奇怪,為什麼有的時候is和==輸出相同,有的時候不同呢。好我們來一探究竟:我們用內置的
id()這函數,這個函數用來傳回物件的記憶體位址,查一下就清楚了
記憶體空間是不是一樣,是不是用的同一塊空間位址,而==是比較兩個物件的內容是否相等.
三、連接字串特別是大規模的字串,最好用join 而不是+##字串處理的時候,最常用的是連接,Python中的字串與其他的語言有一點不同,它是不可變對象,一旦創建不能改變.而這個特性直接會影響到
Python中字符串連接的效率.
用+連接字串:
#
str1,str2,str3='test','string','connection' print(str1+str2+str3) >>>test string connection
str1,str2,str3='test ','string ','connection' print(''.join([str1,str2,str3])) >>>test string connection
但是若是連接大規模的字串,比如要連接10萬左右的字串的時候,join的方法效率就會快很多(甚至相差百倍).比如下面這10萬個字串連接.
long_str_list=['This is a long string' 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('Loop %d'%i) else: print('Else block') >>>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中文網其他相關文章!