隨著最后一個alpha版發布,Python 3.10 的功能更改全面敲定!
現在,正是體驗Python 3.10 新功能的理想時間!正如標題所言,本文將給大家分享Python 3.10中所有重要的功能和更改。
新功能1:聯合運算符
在過去, |符號用于 "算術或"運算,例如:
1
2
3
|
print ( 0 | 0 ) print ( 0 | 1 ) print ({ 1 , 2 } | { 2 , 3 }) |
輸出:
0
1
{1, 2, 3}
在Python 3.10中, |符號有的新語法,可以表示x類型 或 Y類型,以取代之前的typing.Union 完成類型注解
舉個栗子:
函數的參數應該是一個int 或 str類型
舊的寫法:
1
2
3
4
5
|
from typing import Union def f(value: Union[ int , str ]) - > Union[ int , str ]: return value * 2 |
新的寫法:
1
2
|
def f(value: int | str ) - > int | str : return value * 2 |
這種新的語法也被作為isinstance() 和issubclass() 的第二個參數,用于類型判斷
1
|
isinstance ( 1086 , int | str ) # 10086是否為 int型 或 str型 |
新功能2: 多行上下文管理器
在過去,上下文管理器一般用于資源的自動獲取和自動釋放,利用打開文件時使用上下文管理器:
1
2
|
with open ( "test.txt" , "w" ) as f: # 自動打開和關閉文件 f.write( "hello, 我是三木" ) # 對文件進行讀寫 |
如果要復制文件的話,需要打開源文件和目標文件,那么就需要2個上下文管理器,代碼會寫成這個樣子:
1
2
3
4
|
with open ( "test.txt" , "r" ) as f: # 打開第一個文件 with open ( "test_copy.txt" , "w" ) as f_copy: # 打開第二個文件 content = f.read() # 從第一個文件獲取內容 f_copy.write(content) # 向第二個文件寫入內容 |
在Python3.10中,可以將代碼精簡一下:
1
2
3
4
5
6
|
with ( open ( "test.txt" , "r" ) as f, # 打開第一個文件 open ( "test_copy.txt" , "w" ) as f_copy, # 打開第二個文件 ): content = f.read() # 從第一個文件獲取內容 f_copy.write(content) # 向第二個文件寫入內容 |
注意變化:
- with 只出現了1次
- 在同一個代碼段,有2個上下文管理器f和 f_copy
- 這兩個上下文管理可以交互
此外,還可以更加靈(sao)活(qi)的操作:
1
2
3
4
5
6
|
with ( open ( "test.txt" , "r" , encoding = "utf-8" ) as f, # 打開第一個文件 open ( "test_copy.txt" , "w" , encoding = f.encoding) as f_copy, # 打開第二個文件 ): content = f.read() # 從第一個文件獲取內容 f_copy.write(content) # 向第二個文件寫入內容 |
注意細節:在第2個open中,使用了第一個open的結果 :f
新功能3: 結構模式匹配 (Structural Pattern Matching)
如果你熟悉或使用過php,Java或JavaScript等語言,可能見到switch語句,例如這樣:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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 = "星期六" ; } |
簡單來說:根據x的值,選擇指定的case語句進行執行
過去,Python沒有這樣的語句,所以現在,有了!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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也不會有機會匹配到了
- 如果沒有符合條件的匹配,則會執行case_,此_稱之為通配符,通配符是可選的
關于結構匹配模式(Structural Pattern Matching),可以說是Python 3.10 重量級的新功能,它還有很多高級用法,值得專門一篇文章來進行介紹,這里就先不展開了。
總之,作為一個遲到了的“switch”,會在其他編程語言中的實踐經驗上進行改進,成符合Python一貫的風格:簡單、靈活、強大。
新變化:性能改進
與所有最新的Python版本一樣,Python 3.10也帶來了一些性能改進。首先是str(),bytes()和bytearray()構造函數的優化,它們的速度應該提高30%~40%左右(來自 https://bugs.python.org/issue41334)
1
2
3
4
5
6
|
~ $ . / 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核心模塊正在進行持續的優化,讓我們繼續期待吧
新變化:zip支持長度檢查
PEP 618:zip()函數現在具有一個可選strict標志,用于要求所有可迭代對象具有相等的長度
首先回顧一下zip函數的用法:
在一個迭代中,同時向多個序列讀取內容,
可以將行變成列,列變成行,這類似于轉置矩陣。
1
2
3
4
5
|
name_list = [ '報警' , '急救' , '消防' ] number_list = [ 110 , 120 , 119 ] for i in zip (name_list, number_list): print (i) |
輸出
1
2
3
|
( '報警' , 110 ) ( '急救' , 120 ) ( '消防' , 119 ) |
上面的例子有一個特點:name_list 和 number_list 長度是相同的,如果長度不同會怎么樣呢?
1
2
3
4
5
|
name_list = [ '報警' , '急救' , '消防' , '查號' ] number_list = [ 110 , 120 , 119 ] for i in zip (name_list, number_list): print (i) |
輸出
1
2
3
|
( '報警' , 110 ) ( '急救' , 120 ) ( '消防' , 119 ) |
注意:因為長度不同,所以最后一組結果查號是不會顯示的,但是卻沒有任何提示,從結果來看,無法判斷是否有遺漏的數據。
在Python 3.10,可以給zip()傳遞參數strict=True,對長度進行嚴格檢查
1
2
|
for i in zip (name_list, number_list, strict = True ): print (i) |
輸出
1
2
3
4
5
6
7
|
( '報警' , 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的第二個參數比第一個參數短,于是拋出異常
以上就是詳解Python 3.10 中的新功能和變化的詳細內容,更多關于Python 3.10 中的新功能和變化的資料請關注服務器之家其它相關文章!
原文鏈接:https://www.cnblogs.com/dongfangtianyu/p/14713895.html