新方向、新功能:Python3.9 完整版面世了
本文轉載自公眾號“讀芯術”(ID:AI_Discovery)。
很顯然,Python3.9是標志這一著名編程語言從舊路線演化到新路徑的轉折點。本文就將帶大家探索其新功能,了解Python的未來走向。
Python 的新方向
此次更新有兩個重大變化,雖然直觀上不受影響,但要開始注意了:作為一種語言,Python的發(fā)展將略有不同。簡而言之,可總結為:
- Python對解析器的限制
- 版本更小,迭代更頻繁
1. LL(1) 和 PEG
大約30年前,吉多·范·羅森寫了pgen,這是為 Python 編寫的第一批代碼之一,至今仍被用作Python的解析器。Pgen的編寫基于LL(1)的語法變體,這標志著解析器若要全方位讀取代碼,只需先行令牌。這也基本上說明Python的開發(fā)是有限的,因為:
- 先行令牌限制了語法規(guī)則的表現(xiàn)力。
- 由于當前Python已包含非LL(1)語法,解析器迂回方案繁雜,使過程復雜化。
- 即使有這些解決方案,情況也很受限。規(guī)則可以改變但不能違反。
- 使用LL(1)特定的左遞歸語法可能會使解析樹分析無限循環(huán),從而導致棧溢出。
基于LL(1)的解析器的這些屬性限制了Python可能實現(xiàn)的價值,而Python 3.9打破了這些限制,這要歸功于閃亮新星PEG解析器,PEP617有所概述。我們不會很快感受到這一點。在Python 3.10出來之前,新解析器不會更改;但之后,Python將會沖破LL(1)的限制,大顯身手。
2. 開發(fā)周期
Python的發(fā)布計劃將從18 個月縮減到 12 個月。
在 3.9 版本發(fā)布之前,Python原本的發(fā)布計劃是間隔18個月一版的,而現(xiàn)在,它進入了為期12個月的發(fā)布時間表[PEP 602]。從前新版本每18個月才亮相一次,現(xiàn)在一年一換。這也意味著Python:
- 不再一次性上線大量新功能。
- 變化更循序漸進,但由于新功能的發(fā)布,修復將會更快完成。
- 發(fā)布日期更規(guī)律,新Python將在每年10月面世。
所以從本質上講,本文主要關注12個月周期內較小的增量變化,而不是每18個月發(fā)生的較大變化。與此同時,預計開發(fā)速度將保持不變。
二、新功能
1. 類型提示
早在2008年,Python 3就引入了函數(shù)注釋——類型提示的前身。它雖然不是特別強大,但是一個重要開端。
Python類型提示的實時狀態(tài)是多次添加和修改注釋和鍵入的變化累積。
此后又增加了其他功能。如今,3.9版本將各功能與整潔的新語法結合起來,以取得Python類型提示的最新發(fā)展。
現(xiàn)在,我們可以輕松地指定變量的預期數(shù)據類型。如果寫了一些沒有意義的東西(比如把字符串傳遞給整數(shù)),編輯器就會提醒有錯誤產生。雖然不會指出錯誤,但在使用復雜代碼庫時,它可幫了大忙。
在Python中,用“+”連接兩個字符串是絕對有效的。因此,“add_int”函數(shù)接收兩個字符串不會引發(fā)任何錯誤。
無類型提示(左);Python3.9帶類型提示(右)。
有了新的類型提示功能,只需在函數(shù)定義的參數(shù)中添加 :int,編輯器就會立即識別錯誤。
指定預期的輸入和輸出數(shù)據類型。
也可以使用->type 語法來確定函數(shù)的值輸出類型。
可將不同類型結合在一起來創(chuàng)建更復雜的注釋。
不要局限于簡單的預定義類型!
2. 字符串方法
雖然不像其他變化那樣酷,但此方法被使用頻率極高。有兩種用于刪除字符串前綴和后綴的新方法:
- "foo bar".removeprefix("fo")
- [Out]: 'o bar'
- "foo bar".removesuffix("ar")
- [Out]: 'foo b'
3. 合并字典
有兩個新運算符來合并字典。首先是合并運算符 |:
- a = {1: 'a', 2: 'b', 3: 'c'}
- b = {4: 'd', 5: 'e'}c = a | b
- print(c)[Out]: {1: 'a', 2: 'b', 3: 'c', 4:'d', 5: 'e'}
然后更新運算符就地合并:
- a = {1: 'a', 2: 'b', 3: 'c'}
- b = {4: 'd', 5: 'e'}a |= b
- print(a)[Out]: {1: 'a', 2: 'b', 3: 'c', 4:'d', 5: 'e'}
作為一種編程語言,Python未來發(fā)展無限,見證該語言如何隨著新的發(fā)布計劃和解析器而發(fā)展將一定會是很有趣的!