奇酷Python培訓新手容易犯的4個錯誤
來源:
奇酷教育 發(fā)表于:
奇酷教育-Python培訓_Python教程_Python基礎(chǔ)教程
python語言里面有一些小的坑,特別容易弄混弄錯,初學者若不注意的話,很容易坑進去,下面
奇酷Python培訓給大家深入解析一些這幾個坑,希望對初學者有所幫助.
1.i+=1不等于++i
初學者對Python語言不是特別了解的話,又正好有c++,java的語言背景,很容易把++i和i+=1弄混
先來看一個小例子:
i=0
mylist=[1,2,3,4,5,6]
while i <len(mylist):< p>
print(mylist[i])
++i
這段代碼會想當然的認為,沒有啥問題啊,一個循環(huán)輸出,i不斷的+1,蠻對的呀.其實不是的,這個代碼會一直輸出1,一個死循環(huán).因為Python的解釋器會將++i操作為+(+i).其中+表示是正數(shù)符號,對于--i也是類似的.
print(+1)
>>>1
print(++1)
>>>1
print(+++1)
>>>1
這下明白了++i雖然在Python語法是合法的,但是并不是我們理解的自增的操作.
2.分清楚==和is的用法
在判斷字符串是否相等的時候,初學者特別會弄混is和==,這樣的結(jié)果是程序在不同的情況下表現(xiàn)不同:
比如先看一個簡單的例子:
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的結(jié)果是False
print(str1==str2)
>>>True #==的結(jié)果為True,看二者不一樣了吧
第三個例子
str3='string'
str4=''.join(['s','t','r','i','n','g'])
print(str3)
>>>string
print(str3 is str4)
>>>False #is的結(jié)果是False
print(str3==str4)
>>>True #==的結(jié)果為True,看二者不一樣了吧
這就是很容易混淆初學者的地方,感覺很奇怪,為什么有的時候is和==輸出相同,有的時候不同呢.好我們來一探究竟:
我們用內(nèi)置的id()這函數(shù),這個函數(shù)用來返回對象的內(nèi)存地址,查一下就清楚了
is是對象的標示符,用來比較兩個對象的內(nèi)存空間是不是一樣,是不是用的同一塊空間地址,而==是比較兩個對象的內(nèi)容是否相等.
3.連接字符串特別是大規(guī)模的字符串,最好用join而不是+
字符串處理的時候,最常用的是連接,Python中的字符串與其他的語言有一點不同,它是不可變對象,一旦創(chuàng)建不能改變.而這個特性直接會影響到Python中字符串連接的效率.
用+連接字符串:
str1,str2,str3='test','string','connection'
print(str1+str2+str3)
>>>test string connection
用join連接字符串
str1,str2,str3='test ','string ','connection'
print(''.join([str1,str2,str3]))
>>>test string connection
但是若是連接大規(guī)模的字符串,比如要連接10萬左右的字符串的時候,join的方法效率就會快很多(甚至相差百倍).比如下面這10萬個字符串連接.
long_str_list=['This is a long string' for in range(1,100000)]
原因是因為若要連接字符串:S1+S2+S3+....+SN,由于字符串是不可變的對象,執(zhí)行一次就要申請一塊新的內(nèi)存,這樣的話在N個字符串連接的過程中,會產(chǎn)生N-1個中間結(jié)果,每產(chǎn)生一個中間結(jié)果就要申請一次內(nèi)存,這樣會嚴重影響執(zhí)行效率.
而join不一樣,它是一次性申請總的內(nèi)存,然后把字符串里面的每一個元素復制到內(nèi)存中去,所以join會快很多.
因此,字符串的連接,尤其是大的字符串處理,最好用join
4.不要在for和while循環(huán)后面寫else塊
Python提供了一種很多編程語言都不支持的功能,那就是可以在循環(huán)內(nèi)部的語句塊后面直接編寫else塊。比如:
for i in range(3):
print('Loop %d'%i)
else:
print('Else block')
>>>Loop 0
>>>Loop 1
>>>Loop 2
>>>Else block
這種else塊會在整個循環(huán)執(zhí)行完之后立刻運行。既然如此,那它為什么叫做else呢?為什么不叫and ?在if/else語句中,else的意思是:如果不執(zhí)行前面那個if塊,那就執(zhí)行else塊。
同理try/except/else也是如此,該結(jié)構(gòu)的else的含義是:如果前面的try塊沒有失敗,那就執(zhí)行else塊。
try/finally同樣非常直觀,這里的finally的意思是:執(zhí)行過前面的try塊之后,不管如何總是執(zhí)行finally塊。
問題來了對于剛接觸Python的程序員可能會把for/else結(jié)構(gòu)中的else塊理解為:如果循環(huán)沒有正常執(zhí)行完,那就執(zhí)行else塊。
實際上剛好相反——在循環(huán)里用break語句提前跳出,會導致程序不執(zhí)行else塊,這一點會有點繞.對于不熟悉for/else的人來說,會令閱讀代碼的人感到相當費解.
以上就是
qiku為大家分享的“奇酷Python培訓新手容易犯的4個錯誤”謝謝大家觀看,如果對Python感興趣的話,想學
Python培訓的,也可以在線咨詢,我們將竭誠為你解答。