Python 3.9的新功能

聞數起舞 發佈 2020-06-21T10:43:58+00:00

看看最新Python版本中包含的最佳功能> Photo by Pablo Guerrero on Unsplash又是時候了,即將推出新版本的Python。 現在處於beta(3.9.0b3)中,我們很快將看到Python 3.9的完整版本。

看看最新Python版本中包含的最佳功能


又是時候了,即將推出新版本的Python。 現在處於beta(3.9.0b3)中,我們很快將看到Python 3.9的完整版本。

一些最新功能令人難以置信,令人興奮的是,看到它們在發布後會被使用。 我們將介紹以下內容:

· 字典聯合運算符

· 類型提示

· 新的Python解析器-這非常酷

讓我們先來看看這些新功能以及我們如何使用它們。

詞典聯盟

我們有合併運算符|:

a = {1: 'a', 2: 'b', 3: 'c'}

b = {4: 'd', 5: 'e'}

c = a | bprint(c)

[輸出]:{1:" a",2:" b",3:" c",4:" d",5:" e"}

還有更新運算符| =,它將更新原始字典:

a = {1: 'a', 2: 'b', 3: 'c'}

b = {4: 'd', 5: 'e'}

a |= bprint(a)

[輸出]:{1:" a",2:" b",3:" c",4:" d",5:" e"}

如果我們的詞典共享一個公共密鑰,那麼將使用第二個字典中的鍵/值對:

a = {1: 'a', 2: 'b', 3: 'c', 6: 'in both'}

b = {4: 'd', 5: 'e', 6: 'but different'}

print(a | b)

[輸出]:{1:" a",2:" b",3:" c",6:"but different",4:" d",5:" e"}

使用Iterables的字典更新

=運算符的另一個很酷的行為是能夠使用可疊代對象(如列表或生成器)使用新的鍵值對更新字典:

a = {'a': 'one', 'b': 'two'}

b = ((i, i**2) for i in range(3))

a |= bprint(a)

[輸出]:{'a':'one','b':'two',0:0、1:1、2:4}

如果我們對標準聯合運算符嘗試相同的操作| 我們將收到TypeError,因為它將僅允許dict類型之間的並集。

類型提示

Python是動態類型的,這意味著我們無需在代碼中指定數據類型。

沒關係,但有時可能會造成混淆,突然之間,Python的靈活性比其他任何事情都變得更加令人討厭。

從3.5開始,我們可以指定類型,但是非常麻煩。 此更新確實改變了這一點,讓我們舉個例子:


在我們的add_int函數中,我們顯然想為其自身添加相同的數字(出於某些神秘的未定義原因)。 但是我們的編輯器並不知道,使用+將兩個字符串加在一起完全可以,因此不會發出警告。

現在,我們可以將期望的輸入類型指定為int。 使用此功能,我們的編輯人員可以立即了解問題。

我們也可以非常詳細地了解所包含的類型,例如:

類型提示可以在任何地方使用-由於有了新的語法,現在它看起來更加簡潔:


字符串方法

雖然不像其他新功能那樣迷人,但是仍然值得一提,因為它特別有用。 添加了兩個用於刪除前綴和後綴的新字符串方法:

"Hello world".removeprefix("He")

[出]:" llo world"

Hello world".removesuffix("ld")

[出]:"Hello wor"

新解析器

這更多是視線之外的更改,但有可能成為Python未來發展中最重大的更改之一。

Python當前使用的主要是基於LL(1)的語法,而該語法又可以由LL(1)解析器進行解析,該解析器從上到下,從左至右解析代碼,而前瞻性僅為一個標記。

現在,我幾乎不知道它是如何工作的,但是由於使用了這種方法,因此我可以為您介紹Python中的一些當前問題:

· Python包含非LL(1)語法; 因此,當前語法的某些部分使用了變通辦法,從而造成了不必要的複雜性。

· LL(1)在Python語法中創建了限制(沒有可能的解決方法)。 此問題突出表明,以下代碼根本無法使用當前解析器實現(引發SyntaxError):

with (open("a_really_long_foo") as foo, open("a_really_long_bar") as bar): pass

· LL(1)在解析器中以左遞歸中斷。 意味著特定的遞歸語法可能導致解析樹中的無限循環。 Python的創建者Guido van Rossum在這裡解釋了這一點。

所有這些因素(以及我根本無法理解的更多因素)對Python產生了重大影響。 它們限制了語言的發展。

基於PEG的新解析器將為Python開發人員提供更大的靈活性-從Python 3.10起我們將開始注意到這一點。


謝謝閱讀!

(本文翻譯自James Briggs的文章《New Features in Python 3.9》,參考:https://towardsdatascience.com/new-features-in-python39-2529765429fe)

關鍵字: