新版本嘗鮮:Python 3.9版本中的新功能有哪些?
本文轉載自公眾號“讀芯術”(ID:AI_Discovery)。
又要到Python新版本發布的時刻了,測試版已然推出,完整發行版將在不久之后與我們見面。這無疑令技術愛好者們十分興奮,摩拳擦掌地等待上手一探究竟。
新版本中有許多值得期待的新功能,本文就先帶大家嘗嘗鮮。
1. 字典合并
這是筆者最喜歡的新功能之一,它擁有優美的語法。如果有兩個字典a和b需要合并,可以使用合并運算符:
合并(merge)操作符|:
- 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'}
如果字典共享一個公共鍵(common key),則使用第二個字典中的鍵值對:
- a = {1: 'a', 2: 'b', 3: 'c', 6: 'in both'}
- b = {4: 'd', 5: 'e', 6: 'but different'}print(a | b)[Out]: {1: 'a', 2: 'b', 3: 'c', 6: 'but different',4: 'd', 5: 'e'}
使用迭代更新字典:|=運算符還有一個不錯的地方,即能夠通過可迭代對象(例如列表或生成器)使用新的鍵值對更新字典。
- a = {'a': 'one', 'b': 'two'}
- b = ((i, i**2) for i in range(3))a |= b
- print(a)[Out]: {'a': 'one', 'b': 'two', 0: 0, 1: 1, 2: 4}
如果嘗試使用標準合并運算符|進行相同的操作,將產生一個類型錯誤(TypeError),因為它僅允許字典(dict)類型之間的合并操作。

2. 字符串方法
這個功能看起來“其貌不揚”,但實則非常實用。新版本添加了兩個用于刪除前綴和后綴的新字符串方法:
- “ Hello world” .removeprefix(“ He”)
- [Out]:“ llo world”
- Hello world” .removesuffix(“ ld”)
- [Out]:“ Hello wor”
3. 新分析器
這是一個不可見的更改,但有可能成為Python未來發展中最重要的更改之一。
Python當前使用的主要是基于LL(1)的語法,而該語法又可以由LL(1)分析器進行解析,該分析器使用單一的前向標記符從上到下,從左到右地解析代碼。
筆者幾乎不知道它是如何工作的,但是可以指出一些由于Python使用這種方法導致的問題:
- Python包含非LL(1)語法;當前語法的某些部分使用了工作區,從而造成不必要的復雜性。
- LL(1)在Python語法中造成限制(沒有可用的工作區)。此問題突出說明了以下代碼根本無法使用當前分析器實現(引發語法錯誤):
- with (open("a_really_long_foo") as foo,
- open("a_really_long_bar")as bar):
- pass
所有這些因素(還有很多根本無法理解的因素)嚴重限制了Python語言的發展。而基于PEG的新分析器將為Python開發人員提供更大的靈活性,人們會從Python 3.10開始注意到這一點。
4. 類型提示
Python是動態類型的,這意味著無需在代碼中指定數據類型。這一特性本身沒有問題,但有時可能會造成混淆。
從Python 3.5開始,用戶可以指定類型,但是操作起來非常麻煩。此次更新改變了這一點,舉個例子:
無類型提示(左)vs3.9中帶類型提示(右)
add_int函數的目的是為數值自身添加相同的數值。但是編輯器并不知道這一點,因此完全可以使用+將兩個字符串加在一起,不會發出警告。現在可以將期望的輸入類型指定為int。使用此功能,編輯器可以立即了解問題。
用戶還可以非常詳細地了解所包含的類型,例如:

類型提示可以在任何地方使用,新語法讓代碼看起來更加整潔:

將sum_dict的參數指定為dict,將返回值指定為整數型。在定義test時,也要確定其類型。
這些新功能確實讓人迫不及待,等不及的同學可以先去試試最新的Beta版本-3.9.0b3。