自從幾個(gè)月前將最新的 Python 版本添加到 Ubuntu 21.04 以來,它在用戶中變得越來越普遍。這為開發(fā)人員提供了充足的理由立即在他們的項(xiàng)目中開始使用它。因此,我們認(rèn)為讓大家了解最新版本提供了哪些功能是很有必要的——而且我們相信你們肯定也會(huì)喜歡這些功能!
新的字符串方法 ?str.removeprefix
? 和 ?str.removesuffix
?
這將成為粉絲最喜歡的功能,因?yàn)樗鉀Q了 Python 舊 ?str
?方法中一些混亂的東西 。
假設(shè)你想??從文件名中刪除擴(kuò)展名?.py
?,你會(huì)怎么做呢?你認(rèn)為當(dāng)然可以使用 ?str.rstrip
? 函數(shù)從字符串的右端去除擴(kuò)展名,這個(gè)方方法是可以的:
>>> file_string = 'my_test_file.py'
>>> file_name = file_string.rstrip('.py')
>>> file_name
'my_test_file'
除了這一個(gè)致命的問題??纯茨闶欠衲苷业竭@個(gè)輸出的問題:
>>> file_string = 'make_happy.py'
>>> file_name = file_string.rstrip('.py')
>>> file_name
'make_ha'
為什么它刪除了部分文件名?
嗯...這是因?yàn)?nbsp;?rstrip
?(以及 ??lstrip
?and ?strip
??)不接受“字符串”,而是一組要?jiǎng)h除的字符。因此, ?file_string.rstrip('.py')
?并不意味著只刪除 ?.py
??,它還意味著刪除以下任何字符: ?.
?, ?p
?,
and ?y
?,這就是為什么我們文件名末尾是ppy
?的也會(huì)被刪除了。正是因?yàn)檫@個(gè)方法,在許多其他 ?Pythonistas
?中容易引起了錯(cuò)誤和混亂。
這就是為什么Python的3.9添加了兩個(gè)新方法: ?str.removeprefix
? 和 ?str.removesuffix
? ,它們會(huì)處理給定的字符串作為一個(gè)字符串:
>>> file_string = 'make_happy.py'
>>> file_name = file_string.removesuffix('.py')
>>> file_name
'make_happy'
新的 ?dict
? 合并和更新語法
Python 字典已經(jīng)可以合并和更新,如下所示:
>>> alice = {'apples': 1, 'bananas': 2}
>>> bob = {'carrots': 3}
>>> merged = {**alice, **bob} # Dictionary unpacking added in Python 3.5
>>> merged
{'apples': 1, 'bananas': 2, 'carrots': 3}
>>> alice
{'apples': 1, 'bananas': 2}
>>> alice.update(bob) # Updates alice in-place with bob's values
>>> alice
{'apples': 1, 'bananas': 2, 'carrots': 3}
由于合并和更新是字典非常常用的功能(就像集合一樣),這個(gè)新添加的操作簡單地使這些操作更簡單, |
操作符為:
>>> alice = {'apples': 1, 'bananas': 2}
>>> bob = {'carrots': 3}
>>> merged = alice | bob # Merges the two into a new dictionary
>>> merged
{'apples': 1, 'bananas': 2, 'carrots': 3}
>>> alice
{'apples': 1, 'bananas': 2}
>>> alice |= bob # Updates alice in-place
>>> alice
{'apples': 1, 'bananas': 2, 'carrots': 3}
>>>
標(biāo)準(zhǔn)集合中的類型提示泛型
我個(gè)人是這個(gè)功能的超級(jí)粉絲——如果你使用類型注釋,你也會(huì)喜歡這個(gè)。在Python 3.9開始,你就可以開始使用所有內(nèi)置集合類型: list
, dict
, set
, collections.deque
等你的類型的注釋,而不是 typing.List
, typing.Deque
等,也不需要更多的 typing
導(dǎo)入!
# Previously:
from collections import defaultdict
from typing import DefaultDict, List, Set
values: List[int] = []
words: Set[str] = set()
counts: DefaultDict[int, int] = defaultdict(int)
# Starting from Python 3.9:
from collections import defaultdict
values: list[int] = []
words: set[str] = set()
counts: defaultdict[int, int] = defaultdict(int)
兩個(gè)新模塊
Python 3.9 引入了兩個(gè)新模塊:
- ?
zoneinfo
?這為標(biāo)準(zhǔn)庫帶來了對 IANA 時(shí)區(qū)數(shù)據(jù)庫的支持。這意味著 Python 現(xiàn)在內(nèi)置了對夏令時(shí)、國家全年時(shí)間變化等內(nèi)容的支持。 - ?
graphlib
?它具有拓?fù)渑判蛩惴ǖ膶?shí)現(xiàn)。因此,您現(xiàn)在擁有解決復(fù)雜圖形問題的內(nèi)置方法,例如在構(gòu)建系統(tǒng)中對依賴項(xiàng)進(jìn)行排序。
CPython 有一個(gè)新的、更強(qiáng)大的解析器
?CPython
?現(xiàn)在使用基于?PEG
?的新解析器 ,而不是基于舊的?LL1
?算法的解析器。這意味著,對于可以將哪種語法添加到 Python 中存在某些限制,因?yàn)榕f的解析器根本無法讀取更復(fù)雜的代碼。
多行with 語句就是一個(gè)例子 :
# Previously:
with open('file1.txt') as f1, \
open('file2.txt') as f2:
print(f1.read())
print(f2.read())
通常你會(huì)在多行語句周圍使用括號(hào)以獲得更易讀的行分組,并避免在行尾放置尾隨 ?\-es
?。
但是 Python 3.8 中的舊解析器不支持這種語法:
# Starting from Python 3.9:
with (
open('file1.txt') as f1,
open('file2.txt') as f2,
):
print(f1.read())
print(f2.read())
PEG
如果將來需要,新的和改進(jìn)的 解析器算法將能夠處理更復(fù)雜的語法解析。
其他補(bǔ)充
- CPython采用年度發(fā)布周期,即每年發(fā)布一個(gè)新的CPython小版本。
- ?
random.Random.randbytes
? 生成隨機(jī)字節(jié)的新 方法。 - 該 ?
__file__
? 內(nèi)置變量始終是目前的絕對路徑。 - ?
sys.stderr
? 從 Python 3.9 開始總是行緩沖。 - ?
ast
?模塊更新:??將 AST 轉(zhuǎn)換回代碼的新?ast.unparse方法。
在? ast.dump中() 添加 indent用于縮進(jìn)的選項(xiàng) ,類似于 json.dumps.
- ?
PEP 614
?,放寬了對裝飾器的語法限制。
概括
這個(gè)版本的 Python 為我們帶來了許多方便的補(bǔ)充,同時(shí)也為解析器系統(tǒng)的更新和類型變化的更大功能奠定了基礎(chǔ)。要更詳細(xì)地了解此版本中的更改,你可以查看 文檔。