欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python3.10的一些新特性原理分析

 更新時間:2021年09月14日 15:31:17   作者:somenzz  
由于采用了新的發(fā)行計劃:PEP 602 -- Annual Release Cycle for Python,我們可以看到更短的開發(fā)窗口,我們有望在 2021 年 10 月使用今天分享的這些新特性

Python 3.10.0a2 版本已經(jīng)于 2020-11-04 發(fā)布,因此我們可以窺見 Python 3.10 的一些新特性。這些新特性很可能會改變未來的 Python 生態(tài)系統(tǒng),使其朝著更明確,更易讀的方向發(fā)展,同時保持我們熟知和喜歡的易用性。

PEP 602

1、類型注釋的進(jìn)一步擴(kuò)展

3.9 版對 Python 中的類型提示和注釋進(jìn)行了大幅度修改和清理,類型提示這似乎是一種持續(xù)的趨勢,在 3.10 中得到進(jìn)一步擴(kuò)展,目的很明顯,是為了更好的可讀性,無需看代碼即可得知變量和函數(shù)返回值的類型。

延遲類型注釋的執(zhí)行

類型注釋的運(yùn)行通常被認(rèn)為是在函數(shù)定義時執(zhí)行,這意味著類型注釋以自上而下的方式逐行進(jìn)行檢查。

盡管看起來合乎邏輯,但是這樣做有兩個問題:

  • 1、引用尚未定義的類型的類型提示(前向引用)將不起作用,必須以字符串形式表示。也就是說:假如 int 是自定義類型,我們需要編寫 "int" 而不是編寫 int 。
  • 2、這會減慢模塊導(dǎo)入的速度,因為此時會執(zhí)行類型提示。

因此,取而代之的是延遲類型注釋,將類型注釋將以字符串形式存儲在__annotations__中,如果需要這些類型注釋可以在運(yùn)行時通過 typing.get_type_hints() 來解析,也可以通過inspect.signature() 來立即進(jìn)行解析,這樣的好處是可以先執(zhí)行模塊導(dǎo)入,允許前向引用,從而減少初始化時間。

新增類型注釋聯(lián)合操作符

3.10 通過 "|" 作為邏輯或操作符。在注釋數(shù)據(jù)類型時,我們可以使用 | 作為或。例如,我們有一個預(yù)期為 int 或 float 的變量,可以寫為 int | float ,如下所示:

def f(x: int | float) -> float:
    return x * 3.142
f(1)  # pass
f(1.5)  # pass
f('str')  # linter will show annotation error

也可以使用 typing 模塊提供的關(guān)鍵字 Union,比如 Union[int, float]

TypeAlias 注釋

回到前向引用問題,避免前向引用的常見解決方案是將它們編寫為字符串。

但是,將類型寫為字符串會在將這些類型分配給變量時引起問題,因為 Python 會假定我們的字符串文字類型注釋只是一個字符串。

在通常使用類型注釋的地方使用該類型注釋變量將返回錯誤。例如:

MyType = "ClassName"  # ClassName is our type annotation
def foo() -> MyType:
    ...

在這里,我們試圖將其 MyType 用作類型的別名 ,但是, MyType 它將被讀取為字符串值,而不是類型別名。只要 ClassName 在代碼的后面定義,這就是有效的。當(dāng)前情況下,這將引發(fā)注釋錯誤。

為了解決這個問題,添加了一種顯式標(biāo)識 MyType 為類型別名的方法 :

from typing_extensions import TypeAlias
MyType: TypeAlias = "ClassName"
def foo() -> MyType:
    ...
OR
MyType: TypeAlias = ClassName # if we have defined ClassName already
def foo() -> MyType:
    ...

這里說下,為什么類型很重要,盡管這當(dāng)然不是一個巨大的變動,但是看到 Python 開發(fā)人員加倍努力以增強(qiáng)類型功能,這真是太酷了。Python 的優(yōu)勢在于其易用性和缺乏陡峭的學(xué)習(xí)曲線。原因之一是不需要在我們的代碼中顯式定義類型。

增強(qiáng)類型注釋看起來似乎違反直覺,但是為開發(fā)人員 提供定義類型的選項 可以極大地提高代碼庫的可讀性和可維護(hù)性。例如,從 Python transformers 庫的源代碼中可以看到以下說明:

Even without context, we can read this code and immediately grasp what data we should expect to be fed into these functions, classes, and methods — and exactly which datatypes we should be expecting to return.

In complex code bases (and even simple ones), type annotation can massively improve readability. Simultaneously, not everyone will want (or need) to use them — so an optional, exception-free functionality strikes a perfect balance.

意思是即使沒有上下文,我們也可以閱讀此代碼,并立即掌握應(yīng)將哪些數(shù)據(jù)期望輸入到這些函數(shù),類和方法中,以及確切地期望返回哪些數(shù)據(jù)類型。

但在復(fù)雜的代碼庫(甚至簡單的代碼庫)中,類型注釋可以大大提高可讀性。同時,并不是每個人都希望(或需要)使用它們,因此,這是可選的。這種無異常的功能可以達(dá)到完美的平衡。

這些改進(jìn)表明 Python 對類型注釋功能的承諾,基于此,我們最喜歡的庫和我們自己寫的代碼可以大大提示可閱讀性,這會對 Python 生態(tài)系統(tǒng)產(chǎn)生長期的正面影響。

2、新增的函數(shù)及函數(shù)參數(shù)的變化

除了類型提示功能的擴(kuò)展外,核心 Python 功能進(jìn)行了一些更新,如下。

函數(shù) zip() 增加 strict 參數(shù)

函數(shù) zip() 增加 strict 參數(shù),如果設(shè)置 strict = True,而傳輸?shù)膮?shù)的長度不相等將會拋出異常,如下圖所示:

新的 strict 參數(shù)不是盲目地截斷不匹配的數(shù)據(jù),而是使我們能夠控制它的行為,這將使很多開發(fā)人員免于遭受麻煩。

新增整數(shù)的位計數(shù)器 int.bit_count()

此新方法使我們能夠計算整數(shù)的二進(jìn)制表示形式中 1 的個數(shù),在某些場景下這個函數(shù)非常實用且高效。

上圖中的結(jié)果即為整數(shù)以二進(jìn)制位為 1 的個數(shù):

0   = 00000000
1   = 00000001
2   = 00000010
3   = 00000011
10  = 00001010
11  = 00001011
12  = 00001100
100 = 01100100
101 = 01100101
102 = 01100110

字典的視圖增加一個屬性

字典類型的 3 個方法:dict.items()、dict.keys()、dict.values() 分別返回字典的 3 個視圖,現(xiàn)在每個視圖都增加來一個屬性,叫 mapping,具體用法如下:

新的屬性 mapping 的類型屬于 types.MappingProxyType,是圍繞原字典的一個屬性,在任何視圖上訪問 mapping 屬性,都將返回原字典。

現(xiàn)在就這些了,盡管我們距離 3.10 的開發(fā)時間表只有幾個月的時間,但已經(jīng)有很多有趣的更改,Python 的發(fā)展仍在繼續(xù),似乎還會為語言添加更多有趣的功能。

以上就是Python3.10的一些新特性原理分析的詳細(xì)內(nèi)容,更多關(guān)于Python3.10新特性的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python+matplotlib實現(xiàn)堆疊圖的繪制

    Python+matplotlib實現(xiàn)堆疊圖的繪制

    Matplotlib作為Python的2D繪圖庫,它以各種硬拷貝格式和跨平臺的交互式環(huán)境生成出版質(zhì)量級別的圖形。本文將利用Matplotlib庫繪制堆疊圖,感興趣的可以了解一下
    2022-03-03
  • 深入理解Python虛擬機(jī)中的反序列化pyc文件

    深入理解Python虛擬機(jī)中的反序列化pyc文件

    再這篇文章中我們將主要對?Code?Object?進(jìn)行分析,并且詳細(xì)它是如何被反序列化的,通過本篇文章我們將能夠把握整個?pyc?文件結(jié)構(gòu),感興趣的可以了解一下
    2023-05-05
  • Python中operator模塊的操作符使用示例總結(jié)

    Python中operator模塊的操作符使用示例總結(jié)

    operator模塊中包含了Python的各種內(nèi)置操作符,諸如邏輯、比較、計算等,這里我們針對一些常用的操作符來作一個Python中operator模塊的操作符使用示例總結(jié):
    2016-06-06
  • 淺談Tensorflow模型的保存與恢復(fù)加載

    淺談Tensorflow模型的保存與恢復(fù)加載

    本篇文章主要介紹了淺談Tensorflow模型的保存與恢復(fù)加載,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • python中字符串的編碼與解碼詳析

    python中字符串的編碼與解碼詳析

    這篇文章主要給大家介紹了關(guān)于python中字符串的編碼與解碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • python 文本單詞提取和詞頻統(tǒng)計的實例

    python 文本單詞提取和詞頻統(tǒng)計的實例

    今天小編就為大家分享一篇python 文本單詞提取和詞頻統(tǒng)計的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python實現(xiàn)隨機(jī)生成算術(shù)題的示例代碼

    Python實現(xiàn)隨機(jī)生成算術(shù)題的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實現(xiàn)隨機(jī)生成算術(shù)題的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-04-04
  • itchat和matplotlib的結(jié)合使用爬取微信信息的實例

    itchat和matplotlib的結(jié)合使用爬取微信信息的實例

    下面小編就為大家?guī)硪黄猧tchat和matplotlib的結(jié)合使用爬取微信信息的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 小試Python中的pack()使用方法

    小試Python中的pack()使用方法

    這篇文章主要介紹了小試Python中的pack()使用方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • python使用Psutil模塊實現(xiàn)獲取計算機(jī)相關(guān)信息

    python使用Psutil模塊實現(xiàn)獲取計算機(jī)相關(guān)信息

    psutil 是一個跨平臺的庫,用于獲取進(jìn)程和系統(tǒng)運(yùn)行狀態(tài)的信息,這篇文章主要為大家詳細(xì)介紹了python如何調(diào)用psutil模塊實現(xiàn)獲取計算機(jī)相關(guān)信息,有需要的小伙伴可以了解下
    2023-11-11

最新評論