詳解Python 3.10 中的新功能和變化
隨著最后一個alpha版發(fā)布,Python 3.10 的功能更改全面敲定!
現(xiàn)在,正是體驗Python 3.10 新功能的理想時間!正如標題所言,本文將給大家分享Python 3.10中所有重要的功能和更改。
新功能1:聯(lián)合運算符
在過去, |符號用于 "算術(shù)或"運算,例如:
print(0 | 0)
print(0 | 1)
print({1, 2} | {2, 3})
輸出:
0
1
{1, 2, 3}
在Python 3.10中, |符號有的新語法,可以表示x類型 或 Y類型,以取代之前的typing.Union 完成類型注解
舉個栗子:
函數(shù)的參數(shù)應該是一個int 或 str類型
舊的寫法:
from typing import Union
def f(value: Union[int, str]) -> Union[int, str]:
return value*2
新的寫法:
def f(value: int | str) -> int | str:
return value*2
這種新的語法也被作為isinstance() 和issubclass() 的第二個參數(shù),用于類型判斷
isinstance(1086, int | str) # 10086是否為 int型 或 str型
新功能2: 多行上下文管理器
在過去,上下文管理器一般用于資源的自動獲取和自動釋放,利用打開文件時使用上下文管理器:
with open("test.txt", "w") as f: # 自動打開和關(guān)閉文件
f.write("hello, 我是三木") # 對文件進行讀寫
如果要復制文件的話,需要打開源文件和目標文件,那么就需要2個上下文管理器,代碼會寫成這個樣子:
with open("test.txt", "r") as f: # 打開第一個文件
with open("test_copy.txt", "w") as f_copy: # 打開第二個文件
content = f.read() # 從第一個文件獲取內(nèi)容
f_copy.write(content) # 向第二個文件寫入內(nèi)容
在Python3.10中,可以將代碼精簡一下:
with (
open("test.txt", "r") as f, # 打開第一個文件
open("test_copy.txt", "w") as f_copy, # 打開第二個文件
):
content = f.read() # 從第一個文件獲取內(nèi)容
f_copy.write(content) # 向第二個文件寫入內(nèi)容
注意變化:
- with 只出現(xiàn)了1次
- 在同一個代碼段,有2個上下文管理器f和 f_copy
- 這兩個上下文管理可以交互
此外,還可以更加靈(sao)活(qi)的操作:
with (
open("test.txt", "r", encoding="utf-8") as f, # 打開第一個文件
open("test_copy.txt", "w", encoding=f.encoding) as f_copy, # 打開第二個文件
):
content = f.read() # 從第一個文件獲取內(nèi)容
f_copy.write(content) # 向第二個文件寫入內(nèi)容
注意細節(jié):在第2個open中,使用了第一個open的結(jié)果 :f
新功能3: 結(jié)構(gòu)模式匹配 (Structural Pattern Matching)
如果你熟悉或使用過php,Java或JavaScript等語言,可能見到switch語句,例如這樣:
today = new Date().getDay();
switch () {
case 0:
day = "星期天";
break;
case 1:
day = "星期一";
break;
case 2:
day = "星期二";
break;
case 3:
day = "星期三";
break;
case 4:
day = "星期四";
break;
case 5:
day = "星期五";
break;
case 6:
day = "星期六";
}
簡單來說:根據(jù)x的值,選擇指定的case語句進行執(zhí)行
過去,Python沒有這樣的語句,所以現(xiàn)在,有了!
today = 1
match today:
case 0:
day = "星期天"
case 1:
day = "星期一"
case 2:
day = "星期二"
case 3:
day = "星期三"
case 4:
day = "星期四"
case 5:
day = "星期五"
case 6:
day = "星期六"
case _:
day = "別鬧...一個星期只有七天"
print(day)
輸出
星期一
如果將第一行改為today = 8,則輸出
別鬧...一個星期只有七天
注意:
- 匹配順序是從上往下
- 找到一個匹配的case后,會停止,所以不需要向JavaScript一樣寫break語句
- 如果有多個符合條件的case,后面的case也不會有機會匹配到了
- 如果沒有符合條件的匹配,則會執(zhí)行case_,此_稱之為通配符,通配符是可選的
關(guān)于結(jié)構(gòu)匹配模式(Structural Pattern Matching),可以說是Python 3.10 重量級的新功能,它還有很多高級用法,值得專門一篇文章來進行介紹,這里就先不展開了。
總之,作為一個遲到了的“switch”,會在其他編程語言中的實踐經(jīng)驗上進行改進,成符合Python一貫的風格:簡單、靈活、強大。
新變化:性能改進
與所有最新的Python版本一樣,Python 3.10也帶來了一些性能改進。首先是str(),bytes()和bytearray()構(gòu)造函數(shù)的優(yōu)化,它們的速度應該提高30%~40%左右(來自 https://bugs.python.org/issue41334)
~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "str()" Mean +- std dev: [python] 81.9 ns +- 4.5 ns -> [python3.10] 60.0 ns +- 1.9 ns: 1.36x faster (-27%) ~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "bytes()" Mean +- std dev: [python] 85.1 ns +- 2.2 ns -> [python3.10] 60.2 ns +- 2.3 ns: 1.41x faster (-29%) ~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "bytearray()" Mean +- std dev: [python] 93.5 ns +- 2.1 ns -> [python3.10] 73.1 ns +- 1.8 ns: 1.28x faster (-22%)
此外,還有多個Python核心模塊正在進行持續(xù)的優(yōu)化,讓我們繼續(xù)期待吧
新變化:zip支持長度檢查
PEP 618:zip()函數(shù)現(xiàn)在具有一個可選strict標志,用于要求所有可迭代對象具有相等的長度
首先回顧一下zip函數(shù)的用法:
在一個迭代中,同時向多個序列讀取內(nèi)容,
可以將行變成列,列變成行,這類似于轉(zhuǎn)置矩陣。
name_list = ['報警', '急救', '消防']
number_list = [110, 120, 119]
for i in zip(name_list, number_list):
print(i)
輸出
('報警', 110)
('急救', 120)
('消防', 119)
上面的例子有一個特點:name_list 和 number_list 長度是相同的,如果長度不同會怎么樣呢?
name_list = ['報警', '急救', '消防', '查號']
number_list = [110, 120, 119]
for i in zip(name_list, number_list):
print(i)
輸出
('報警', 110)
('急救', 120)
('消防', 119)
注意:因為長度不同,所以最后一組結(jié)果查號是不會顯示的,但是卻沒有任何提示,從結(jié)果來看,無法判斷是否有遺漏的數(shù)據(jù)。
在Python 3.10,可以給zip()傳遞參數(shù)strict=True,對長度進行嚴格檢查
for i in zip(name_list, number_list, strict=True):
print(i)
輸出
('報警', 110)
('急救', 120)
('消防', 119)
Traceback (most recent call last):
File "C:\Users\san\PycharmProjects\py310\a.py", line 4, in <module>
for i in zip(name_list, number_list, strict=True):
ValueError: zip() argument 2 is shorter than argument 1
注意: zip的第二個參數(shù)比第一個參數(shù)短,于是拋出異常
以上就是詳解Python 3.10 中的新功能和變化的詳細內(nèi)容,更多關(guān)于Python 3.10 中的新功能和變化的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python logging設(shè)置level失敗的解決方法
今天小編就為大家分享一篇python logging設(shè)置level失敗的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Python Web框架Flask信號機制(signals)介紹
這篇文章主要介紹了Python Web框架Flask信號機制(signals)介紹,本文介紹Flask的信號機制,講述信號的用途,并給出創(chuàng)建信號、訂閱信號、發(fā)送信號的方法,需要的朋友可以參考下2015-01-01
Python利用reportlab實現(xiàn)制作pdf報告
這篇文章主要為大家詳細介紹了reportlab生成流文件格式、reportlab分頁和圖片流文件寫入reportlab等內(nèi)容,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2022-12-12
Python基于DB-API操作MySQL數(shù)據(jù)庫過程解析
這篇文章主要介紹了Python基于DB-API操作MySQL數(shù)據(jù)庫過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04
yolov5 win10 CPU與GPU環(huán)境搭建過程
這篇文章主要介紹了yolov5 win10 CPU與GPU環(huán)境搭建過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04

