看看最新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)