關(guān)于python版本更新的內(nèi)容,現(xiàn)在有了一個(gè)明確的發(fā)行計(jì)劃,在去年的十月份,python3.10的一些新特性被提出。而今天,我們已經(jīng)可以安裝正式版python來體驗(yàn)這些新特性了。這些新特性包括:類型注釋的進(jìn)一步拓展,延遲類型注釋的執(zhí)行,類型注釋聯(lián)合操作符,帶括號(hào)的上下文管理器,顯式類型別名,加強(qiáng)版的Switch-case(python中叫match-case)語(yǔ)句,更友好的報(bào)錯(cuò)提示等。棄用了distutils 等內(nèi)容。詳細(xì)的內(nèi)容可以前往python官網(wǎng)查看相關(guān)文檔,這里小編主要介紹它是如何對(duì)新手更加友好的。
更友好的報(bào)錯(cuò)提示
很多編程語(yǔ)言都有一套自己的報(bào)錯(cuò)機(jī)制,就小編的學(xué)習(xí)經(jīng)歷而言,python的報(bào)錯(cuò)提示是比較友好的。小編學(xué)習(xí)的第一門語(yǔ)言是C語(yǔ)言,當(dāng)時(shí)使用的是一代經(jīng)典IDE——visual C++6.0,它在編譯的時(shí)候如果代碼有錯(cuò)誤會(huì)進(jìn)行報(bào)錯(cuò),小編覺得vc6.0的報(bào)錯(cuò)是十分詳細(xì)的,我們只需要根據(jù)報(bào)錯(cuò)的提示信息進(jìn)行修改,就能把代碼改好,VC6.0的優(yōu)點(diǎn)就在于此:他的代碼提示很詳細(xì)。然而因?yàn)樗荂語(yǔ)言,所以本身代碼會(huì)比較難懂,這點(diǎn)不能賴它的報(bào)錯(cuò)提示,只能說C語(yǔ)言的報(bào)錯(cuò)提示像一把高手才能駕馭的寶劍,對(duì)于初學(xué)C語(yǔ)言,對(duì)C語(yǔ)言語(yǔ)法不夠熟悉的小伙伴不太友好。
小編學(xué)習(xí)的第二門語(yǔ)言是java,java的報(bào)錯(cuò)實(shí)際上和python很相似,他們的報(bào)錯(cuò)都會(huì)將調(diào)用棧打印出來,我們可以順著調(diào)用棧去一層一層的找到最終錯(cuò)誤的地方,python的報(bào)錯(cuò)提示也是比較詳細(xì)的。但是有編譯過程的語(yǔ)言有一個(gè)共同的缺點(diǎn):會(huì)將所有的錯(cuò)誤都報(bào)出來。原因在于他們?cè)诰幾g的時(shí)候是通篇代碼進(jìn)行編譯的,而不是想python一樣逐行解釋,他們會(huì)將整篇代碼的錯(cuò)誤統(tǒng)統(tǒng)都找出來,如果代碼錯(cuò)誤較少,這樣的報(bào)錯(cuò)無傷大雅,但對(duì)于新手而言,可能寫一個(gè)helloworld就能爆出七八個(gè)錯(cuò)誤,在java里七把個(gè)報(bào)錯(cuò)打印出來的報(bào)錯(cuò)提示可以有一大頁(yè),里面還充斥著各種令人看不懂的包,新手看了直接莫名其妙。
接下來就是python,在之前版本的python報(bào)錯(cuò)中,其實(shí)類似于java,但是他有兩點(diǎn)不同。第一,他比較簡(jiǎn)略,只給出了錯(cuò)誤的原因,比如簡(jiǎn)單的提示語(yǔ)法錯(cuò)誤。這對(duì)于其他報(bào)錯(cuò)來說是一個(gè)缺點(diǎn)。第二,由于python逐行解釋的特點(diǎn),就算一篇代碼有很多錯(cuò)誤,python也只會(huì)一個(gè)一個(gè)的報(bào)錯(cuò),而不是像編譯型語(yǔ)言一樣一次全部報(bào)出來,這點(diǎn)對(duì)于報(bào)錯(cuò)的易讀性而言算是一個(gè)優(yōu)點(diǎn)。
但是今天我們要介紹的,是python3.10,更新后的python報(bào)錯(cuò),解決了之前的缺點(diǎn),現(xiàn)在python報(bào)錯(cuò)也能更加詳細(xì)了,來看看現(xiàn)在的python報(bào)錯(cuò):
str = "未閉合的str
File "d:\projects\python\learn\Py310探索.py", line 90
str = "未閉合的str
^
SyntaxError: unterminated string literal (detected at line 90)
arr = [1, 2, 2, 3
File "d:\projects\python\learn\Py310探索.py", line 91
arr = [1, 2, 2, 3
^
SyntaxError: '[' was never closed
類型注釋
喜歡python的小伙伴有一些是青睞他的動(dòng)態(tài)變量,我們無需聲明變量的類型就可以引用,這個(gè)變量上一秒還是int型的,下一秒就變成float了,這一切全憑我的意愿。但這實(shí)際上會(huì)帶來兩個(gè)問題,對(duì)于解釋器而言,要處理這些動(dòng)態(tài)類型需要解釋器去猜測(cè)這個(gè)變量的類型,在運(yùn)算的時(shí)候好及時(shí)轉(zhuǎn)換,這會(huì)降低解釋器的效率。對(duì)于程序員而言,有變量類型的函數(shù)我們不需要看函數(shù)內(nèi)部代碼就能知道這個(gè)函數(shù)傳進(jìn)去的參數(shù)是什么類型,返回的又是什么類型。而這一點(diǎn)在老版本的python中做不到。老版本的Python中我們需要看完這個(gè)函數(shù)的代碼才能去猜測(cè)傳入?yún)?shù)和返回值的類型(看起來像是重復(fù)解釋器遇到的困境,但實(shí)際上困擾解釋器的問題也困擾著我們),一個(gè)函數(shù)的代碼量如果較少且容易理解,或者帶有注釋,對(duì)我們帶來的影響可能沒那么大,但當(dāng)寫代碼的人不寫注釋且函數(shù)復(fù)雜難懂的時(shí)候那就是一場(chǎng)災(zāi)難。
在新版本的python中來了類型注釋,這樣可以明顯地提高代碼的可讀性。小編認(rèn)為這也是提高python易學(xué)性的一個(gè)關(guān)鍵。
def f(x: int | float) -> float:
return x * 3.142
f(1) # pass
f(1.5) # pass
f('str') # linter will show annotation error
類似上面這樣,傳入的參數(shù)可能是int也可能是float,雖然這部分內(nèi)容是來自類型注釋聯(lián)合操作符的,但也能看到類型注釋相關(guān)的內(nèi)容。
小結(jié)
python3.10更新了很多有趣的東西,python也因此變得更加易于學(xué)習(xí),現(xiàn)在正是學(xué)習(xí)python的好時(shí)機(jī),小伙伴們趕快來學(xué)習(xí)python吧