Python3.10更新

2022-03-04 11:02 更新

python3.10版本于2021年10月4日發(fā)布正式版,該版本帶來了七大新特性。為了讓大家對新版本有更好的認(rèn)識,接下來的介紹會盡量添加python3.10版本和舊版本的代碼進(jìn)行對比。

 帶*號的為比較重要的特性。

*類型檢查改進(jìn)

Python3.10版本中,聯(lián)合運算符使用“|”線來代替了舊版本中的Union[]方法,使得程序更加簡潔,不僅如此,Python3.10在一些內(nèi)置函數(shù)中,同樣可以利用“|”線的聯(lián)合運算符來提升程序的性能。

在函數(shù)中:

from typing import Union # 使用Union需要引入對應(yīng)的包

# 舊版本

def oldFunc(para: Union[int, float]) -> Union[int, float]: 

    return para ** 2

# 新版本

def newFunc(para: int | float) -> int | float:

    return para ** 2

print(newFunc(3))

在內(nèi)置函數(shù)中使用聯(lián)合運算符:

# 舊版本

print(isinstance("W3Cschool", (str, int)))

# 新版本

print(isinstance("W3Cschool", str | int))

*上下文管理器

python3.10 中,with 支持使用外層圓括號來使用多個上下文管理器,可以連續(xù)多行地書寫。這允許將過長的上下文管理器集能夠以與之前 import 語句類似的方式格式化為多行的形式。例如,以下這些示例寫法現(xiàn)在都是有效的:

with (CtxManager() as example):
    pass

with (CtxManager1(),
    CtxManager2()):
    pass

with (CtxManager1() as example,
      CtxManager2()):
    pass

with (CtxManager1(),
      CtxManager2() as example):
    pass

with (CtxManager1() as example1,
    CtxManager2() as example2
):
    pass

*模板匹配

Python 3.10 引入了結(jié)構(gòu)化的模式匹配,通過match...case關(guān)鍵詞來完成,可以匹配字典,類以及其他更復(fù)雜的結(jié)構(gòu)。match...case的模式匹配,在使用的方式上與C++中的switch有很多的相似之處。

下面的函數(shù)中,case函數(shù)通過匹配grade,如果grade為'A',則匹配到第一個例子,如果grade為'B',則匹配到第二個例子...如果前面的案例都不滿足時,則輸出最后的默認(rèn)結(jié)果。

grade = 'B'
match grade: # 看grade變量,并與下面的case做對比(類似其他語言的switch
case 'A': # 如果grade為'A',則執(zhí)行該代碼塊
print("很棒")
case 'B': # 如果grade為'B',則執(zhí)行該代碼塊
print("做得好")
case 'C': # 如果grade為'C',則執(zhí)行該代碼塊
print("您通過了")
case "D":
print("最好再試一下")
case _: # 如果上面的所有case都未命中,則執(zhí)行該代碼塊(類似于其他語言的default)
print("無效的成績")

字典增加mapping屬性

在Python3.10中,針對于字典的三個方法,items,keys和values都增加了一個新的“mapping”屬性,通過上述的程序可以發(fā)現(xiàn),對三個方法調(diào)用mapping屬性后都會返回原字典數(shù)據(jù)。

mydict = {"W3Cschool": 1, "baidu": 2, "Google": 3}

# 舊版本
print(mydict.keys())
print(mydict.values())
print(mydict.items())

# 新版本
keys = mydict.keys()
values = mydict.values()
items = mydict.items()

print(keys.mapping)
print(values.mapping)
print(items.mapping)

# 可以理解為我們可以根據(jù)字典的keys,values,items反向推出這個字典

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

Python3.10中對于zip函數(shù)添加了strict參數(shù),顧名思義,strict參數(shù)就是要嚴(yán)格的遵守參數(shù)長度的匹配原則,下面程序中,keys和values列表的長度并不一致。

舊版本的zip函數(shù)會根據(jù)長度最短的參數(shù)來創(chuàng)建字典。新版本的zip函數(shù)中,當(dāng)設(shè)定strict參數(shù)設(shè)置為True時,則要求zip的輸入?yún)?shù)必須要長度一致,否則就會報錯。

keys = ['W3Cschool', 'Baidu', 'Google']
values = [1,2,3,4]
#舊版本
try:
print(dict(zip(keys,values)))
except:
print("字典創(chuàng)建失敗")

try:
print(dict(zip(keys, values, strict=True)))
# 增加strict參數(shù)后,如果兩個列表長度不等,創(chuàng)建的時候會報錯
except:
print("字典創(chuàng)建失敗")#報錯后使用try-except語句捕獲

二進(jìn)制表示中的頻率為1的數(shù)量統(tǒng)計

在Python3.10版本中,可以通過調(diào)用bit_count函數(shù)來統(tǒng)計二進(jìn)制中數(shù)字“1”的個數(shù),當(dāng)然,在舊版本中,也可以通過很簡單的代碼實現(xiàn)這個功能。

value = 5
#舊版本
print(bin(value).count("1"))
#新版本
print(value.bit_count())

類型別名的更改

在舊版本中,可以直接通過不同類型的賦值操作來賦予類型新的名字,而在Python3.10版本中,則通過TypeAlias來規(guī)定了類型名字的替換。這樣操作的優(yōu)勢在于能夠讓程序開發(fā)人員和Python編輯器更加清楚的知道newname是一個變量名還是一個類型的別名,提升程序開發(fā)的可靠性。

from typing import TypeAlias # 使用TypeAlias需要導(dǎo)入相關(guān)的包

#舊版本 oldname = str def oldFunc(paran:olaname)->oldname:     return param+param #新版本 newname:TypeAlias = str def newFunc(param:newname)->newname:     return param+param print(newFunc("W3Cschool"))

準(zhǔn)備棄用Distutils 內(nèi)置庫

由于Distutils庫的功能已經(jīng)被此setuptools和package庫取代了,所以本著簡潔性的原則,Distutils在不久的將來(3.12版本)將會被完全的刪除掉。

 Distutils包為將待構(gòu)建和安裝的額外的模塊,打包成 Python 安裝包提供支持。新模塊既可以是百分百的純 Python,也可以是用 C 寫的擴(kuò)展模塊,或者可以是一組包含了同時用 Python 和 C 編碼的 Python 包。

大多數(shù) Python 用戶 不會 想要直接使用這個包,而是使用 Python 包官方維護(hù)的跨版本工具。特別地, setuptools 是一個對于 distutils 的增強(qiáng)選項,它能提供:

  • 對聲明項目依賴的支持
  • 額外的用于配置哪些文件包含在源代碼發(fā)布中的機(jī)制(包括與版本控制系統(tǒng)集成需要的插件)
  • 生成項目“進(jìn)入點”的能力,進(jìn)入點可用作應(yīng)用插件系統(tǒng)的基礎(chǔ)
  • 自動在安裝時間生成 Windows 命令行可執(zhí)行文件的能力,而不是需要預(yù)編譯它們
  • 跨所有受支持的 Python 版本上的一致的表現(xiàn)


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號