Python新手們?nèi)菀追傅膸讉€(gè)錯(cuò)誤總結(jié)
前言
這篇文章主要給大家總結(jié)了關(guān)于學(xué)習(xí)Python的新手們?nèi)菀追傅膸讉€(gè)錯(cuò)誤,一共四個(gè)易犯錯(cuò)誤,下面來(lái)看看詳細(xì)的介紹吧。
一、i+=1 不等于++i
初學(xué)者對(duì)Python語(yǔ)言不是特別了解的話,又正好有c++,java的語(yǔ)言背景,很容易把++i和i+=1弄混
先來(lái)看一個(gè)小例子:
i=0 mylist=[1,2,3,4,5,6] while i <len(mylist): print(mylist[i]) ++i
這段代碼會(huì)想當(dāng)然的認(rèn)為,沒(méi)有啥問(wè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也是類(lèi)似的.
print(+1) >>>1 print(++1) >>>1 print(+++1) >>>1
這下明白了++i雖然在Python語(yǔ)法是合法的,但是并不是我們理解的自增的操作.
二、分清楚==和is的用法
在判斷字符串是否相等的時(shí)候,初學(xué)者特別會(huì)弄混is和==,這樣的結(jié)果是程序在不同的情況下表現(xiàn)不同:
比如先看一個(gè)簡(jiǎn)單的例子:
a='Hi' b='Hi' print(a is b) >>>True print(a==b) >>>True #看起來(lái)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é)果為T(mén)rue,看二者不一樣了吧
第三個(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é)果為T(mén)rue,看二者不一樣了吧
這就是很容易混淆初學(xué)者的地方,感覺(jué)很奇怪,為什么有的時(shí)候is和==輸出相同,有的時(shí)候不同呢.好我們來(lái)一探究竟:
我們用內(nèi)置的id()這函數(shù),這個(gè)函數(shù)用來(lái)返回對(duì)象的內(nèi)存地址,查一下就清楚了

is是對(duì)象的標(biāo)示符,用來(lái)比較兩個(gè)對(duì)象的內(nèi)存空間是不是一樣,是不是用的同一塊空間地址,而==是比較兩個(gè)對(duì)象的內(nèi)容是否相等.
三、連接字符串特別是大規(guī)模的字符串,最好用join 而不是+
字符串處理的時(shí)候,最常用的是連接,Python中的字符串與其他的語(yǔ)言有一點(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萬(wàn)左右的字符串的時(shí)候,join的方法效率就會(huì)快很多(甚至相差百倍).比如下面這10萬(wàn)個(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è)字符串連接的過(guò)程中,會(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
四、不要在for 和while 循環(huán)后面寫(xiě)else 塊
Python 提供了一種很多編程語(yǔ)言都不支持的功能,那就是可以在循環(huán)內(nèi)部的語(yǔ)句塊后面直接編寫(xiě)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 語(yǔ)句中,else 的意思是:如果不執(zhí)行前面那個(gè)if 塊,那就執(zhí)行else 塊。
- 同理try/except/else 也是如此,該結(jié)構(gòu)的else 的含義是:如果前面的try 塊沒(méi)有失敗,那就執(zhí)行else 塊。
- try/finally 同樣非常直觀,這里的finally 的意思是:執(zhí)行過(guò)前面的try 塊之后,不管如何總是執(zhí)行finally塊。
問(wèn)題來(lái)了對(duì)于剛接觸Python 的程序員可能會(huì)把for/else 結(jié)構(gòu)中的else 塊理解為:如果循環(huán)沒(méi)有正常執(zhí)行完,那就執(zhí)行else 塊。
實(shí)際上剛好相反——在循環(huán)里用break語(yǔ)句提前跳出,會(huì)導(dǎo)致程序不執(zhí)行else 塊,這一點(diǎn)會(huì)有點(diǎn)繞.對(duì)于不熟悉for/else 的人來(lái)說(shuō),會(huì)令閱讀代碼的人感到相當(dāng)費(fèi)解.
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Python運(yùn)行的17個(gè)時(shí)新手常見(jiàn)錯(cuò)誤小結(jié)
- 新手該如何學(xué)python怎么學(xué)好python?
- Python完全新手教程
- Python新手實(shí)現(xiàn)2048小游戲
- python新手經(jīng)常遇到的17個(gè)錯(cuò)誤分析
- 一篇文章入門(mén)Python生態(tài)系統(tǒng)(Python新手入門(mén)指導(dǎo))
- Python 功能和特點(diǎn)(新手必學(xué))
- 深入理解 Python 中的多線程 新手必看
- 對(duì)Python新手編程過(guò)程中如何規(guī)避一些常見(jiàn)問(wèn)題的建議
- Python新手在作用域方面經(jīng)常容易碰到的問(wèn)題
相關(guān)文章
淺談Python類(lèi)的__getitem__和__setitem__特殊方法
下面小編就為大家?guī)?lái)一篇淺談Python類(lèi)的__getitem__和__setitem__特殊方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
Python中GPU計(jì)算的庫(kù)pycuda的使用
本文主要介紹了Python中GPU計(jì)算的庫(kù)pycuda的使用,詳細(xì)介紹了PyCUDA 庫(kù)的特性、用法,并通過(guò)豐富的示例代碼展示其在實(shí)際項(xiàng)目中的應(yīng)用,感興趣的可以了解一下2024-05-05
python實(shí)現(xiàn)windows倒計(jì)時(shí)鎖屏功能
這篇文章主要介紹了python實(shí)現(xiàn)windows倒計(jì)時(shí)鎖屏功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
Tensorflow 實(shí)現(xiàn)修改張量特定元素的值方法
今天小編就為大家分享一篇Tensorflow 實(shí)現(xiàn)修改張量特定元素的值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Python?pygame新手入門(mén)基礎(chǔ)教程
大家都知道pygame是跨平臺(tái)Python模塊,專(zhuān)為電子游戲設(shè)計(jì),包含圖像、聲音,這篇文章主要給大家介紹了關(guān)于Python?pygame新手入門(mén)基礎(chǔ)教程的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
python獲取命令行輸入?yún)?shù)列表的實(shí)例代碼
今天小編就為大家分享一篇python獲取命令行輸入?yún)?shù)列表的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06

