App下載

Python 3.9 有哪些新變化?

指上菁蕪 2021-09-03 10:34:28 瀏覽數(shù) (2001)
反饋

自從幾個月前將最新的 Python 版本添加到 Ubuntu 21.04 以來,它在用戶中變得越來越普遍。這為開發(fā)人員提供了充足的理由立即在他們的項(xiàng)目中開始使用它。因此,我們認(rèn)為讓大家了解最新版本提供了哪些功能是很有必要的——而且我們相信你們肯定也會喜歡這些功能!

新的字符串方法 ?str.removeprefix? 和 ?str.removesuffix?

這將成為粉絲最喜歡的功能,因?yàn)樗鉀Q了 Python 舊 ?str ?方法中一些混亂的東西 。

假設(shè)你想??從文件名中刪除擴(kuò)展名?.py?,你會怎么做呢?你認(rèn)為當(dāng)然可以使用 ?str.rstrip? 函數(shù)從字符串的右端去除擴(kuò)展名,這個方方法是可以的:

>>> file_string = 'my_test_file.py'
>>> file_name = file_string.rstrip('.py')
>>> file_name
'my_test_file'

除了這一個致命的問題。看看你是否能找到這個輸出的問題:

>>> file_string = 'make_happy.py'
>>> file_name = file_string.rstrip('.py')
>>> file_name
'make_ha'

為什么它刪除了部分文件名?

嗯...這是因?yàn)?nbsp;?rstrip ?(以及 ??lstrip ?and  ?strip??)不接受“字符串”,而是一組要刪除的字符。因此, ?file_string.rstrip('.py') ?并不意味著只刪除  ?.py??,它還意味著刪除以下任何字符:  ?.?,  ?p?, and  ?y?,這就是為什么我們文件名末尾是ppy ?的也會被刪除了。正是因?yàn)檫@個方法,在許多其他 ?Pythonistas ?中容易引起了錯誤和混亂。

這就是為什么Python的3.9添加了兩個新方法: ?str.removeprefix? 和 ?str.removesuffix? ,它們會處理給定的字符串作為一個字符串:

>>> 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}

由于合并和更新是字典非常常用的功能(就像集合一樣),這個新添加的操作簡單地使這些操作更簡單, | 操作符為:

>>> 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)集合中的類型提示泛型

我個人是這個功能的超級粉絲——如果你使用類型注釋,你也會喜歡這個。在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)

兩個新模塊

Python 3.9 引入了兩個新模塊:

  • ?zoneinfo ?這為標(biāo)準(zhǔn)庫帶來了對 IANA 時區(qū)數(shù)據(jù)庫的支持。這意味著 Python 現(xiàn)在內(nèi)置了對夏令時、國家全年時間變化等內(nèi)容的支持。
  • ?graphlib?它具有拓?fù)渑判蛩惴ǖ膶?shí)現(xiàn)。因此,您現(xiàn)在擁有解決復(fù)雜圖形問題的內(nèi)置方法,例如在構(gòu)建系統(tǒng)中對依賴項(xiàng)進(jìn)行排序。

CPython 有一個新的、更強(qiáng)大的解析器

?CPython ?現(xiàn)在使用基于?PEG?的新解析器 ,而不是基于舊的?LL1 ?算法的解析器。這意味著,對于可以將哪種語法添加到 Python 中存在某些限制,因?yàn)榕f的解析器根本無法讀取更復(fù)雜的代碼。

多行with 語句就是一個例子 :

# Previously:
with open('file1.txt') as f1, \
        open('file2.txt') as f2:
    print(f1.read())
    print(f2.read())

通常你會在多行語句周圍使用括號以獲得更易讀的行分組,并避免在行尾放置尾隨 ?\-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ā)布一個新的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?,放寬了對裝飾器的語法限制。

概括

這個版本的 Python 為我們帶來了許多方便的補(bǔ)充,同時也為解析器系統(tǒng)的更新和類型變化的更大功能奠定了基礎(chǔ)。要更詳細(xì)地了解此版本中的更改,你可以查看 文檔


1 人點(diǎn)贊