日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Python新手容易犯的4個(gè)錯(cuò)

 Four兄 2019-08-24

閱讀本文大概需要4分鐘


python語言里面有一些小的,特別容易弄混弄錯(cuò),初學(xué)者若不注意的話,很容易坑進(jìn)去,下面我給大家深入解析一些這幾個(gè)坑,希望對(duì)初學(xué)者有所幫助.

1.i+=1 不等于++i

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

先來看一個(gè)小例子:

i=0

mylist=[1,2,3,4,5,6]

while i <len(mylist):

    print(mylist[i])

    ++i

這段代碼會(huì)想當(dāng)然的認(rèn)為,沒有啥問題啊,一個(gè)循環(huán)輸出,i不斷的+1,蠻對(duì)的呀.其實(shí)不是的,這個(gè)代碼會(huì)一直輸出1,一個(gè)死循環(huán).因?yàn)镻ython的解釋器會(huì)將++i操作為+(+i).其中+表示是正數(shù)符號(hào),對(duì)于--i也是類似的.

print(+1)

>>>1

print(++1)

>>>1

print(+++1)

>>>1

這下明白了++i雖然在Python語法是合法的,但是并不是我們理解的自增的操作.

2.分清楚==和is的用法

在判斷字符串是否相等的時(shí)候,初學(xué)者特別會(huì)弄混is和==,這樣的結(jié)果是程序在不同的情況下表現(xiàn)不同:

  • 比如先看一個(gè)簡(jiǎn)單的例子:

a='Hi'

b='Hi'

print(a is b)

>>>True

print(a==b)

>>>True #看起來is和==好像是一樣的

  • 我們?cè)倏吹诙€(gè)例子:

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,看二者不一樣了吧

  • 第三個(gè)例子

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,看二者不一樣了吧

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

我們用內(nèi)置的id()這函數(shù),這個(gè)函數(shù)用來返回對(duì)象的內(nèi)存地址,查一下就清楚了


is是對(duì)象的標(biāo)示符,用來比較兩個(gè)對(duì)象的內(nèi)存空間是不是一樣,是不是用的同一塊空間地址,而==是比較兩個(gè)對(duì)象的內(nèi)容是否相等.

3.連接字符串特別是大規(guī)模的字符串,最好用join 而不是+

字符串處理的時(shí)候,最常用的是連接,Python中的字符串與其他的語言有一點(diǎn)不同,它是不可變對(duì)象,一旦創(chuàng)建不能改變.而這個(gè)特性直接會(huì)影響到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萬左右的字符串的時(shí)候,join的方法效率就會(huì)很多(甚至相差百倍).比如下面這10萬個(gè)字符串連接.

long_str_list=['This is a long string' for n in range(1,100000)]

原因是因?yàn)槿粢B接字符串:S1+S2+S3+....+SN,由于字符串是不可變的對(duì)象,執(zhí)行一次就要申請(qǐng)一塊新的內(nèi)存,這樣的話在N個(gè)字符串連接的過程中,會(huì)產(chǎn)生N-1個(gè)中間結(jié)果,每產(chǎn)生一個(gè)中間結(jié)果就要申請(qǐng)一次內(nèi),這樣會(huì)嚴(yán)重影響執(zhí)行效率.

而join不一樣,它是一次性申請(qǐng)總的內(nèi)存,然后把字符串里面的每一個(gè)元素復(fù)制到內(nèi)存中去,所以join會(huì)快很多.

因此,字符串的連接,尤其是大的字符串處理,最好用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ì)在整個(gè)循環(huán)執(zhí)行完之后立刻運(yùn)行。既然如此,那它為什么叫做else 呢?為什么不叫and ?在if/else 語句中,else 的意思是:如果不執(zhí)行前面那個(gè)if 塊,那就執(zhí)行else 塊。

  • 同理try/except/else 也是如此,該結(jié)構(gòu)的else 的含義是:如果前面的try 塊沒有失敗,那就執(zhí)行else 塊。

  • try/finally 同樣非常直觀,這里的finally 的意思是:執(zhí)行過前面的try 塊之后,不管如何總是執(zhí)行finally塊。

問題來了對(duì)于剛接觸Python 的程序員可能會(huì)把for/else 結(jié)構(gòu)中的else 塊理解為:如果循環(huán)沒有正常執(zhí)行完,那就執(zhí)行else 塊。

實(shí)際上剛好相反——在循環(huán)里用break語句提前跳出,會(huì)導(dǎo)致程序執(zhí)行else 塊,這一點(diǎn)會(huì)有點(diǎn)繞.對(duì)于不熟悉for/else 的人來說,會(huì)令閱讀代碼的人感到相當(dāng)費(fèi)解.

最后說一下,若我寫的對(duì)大家有幫助,麻煩大家支持一下,也是對(duì)我的一點(diǎn)鼓勵(lì)和動(dòng)力.

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多