Python match語(yǔ)句的具體使用
python 3.10支持match語(yǔ)句,3,10以下不支持。
match語(yǔ)句接受一個(gè)表達(dá)式,并將其值與作為一個(gè)或多個(gè)case塊給出的連續(xù)模式進(jìn)行比較。這表面上類(lèi)似于C、Java或JavaScript(以及許多其他語(yǔ)言)中的switch語(yǔ)句,但更類(lèi)似于Rust或Haskell等語(yǔ)言中的模式匹配。只有第一個(gè)匹配的模式才會(huì)被執(zhí)行,它還可以將值中的組件(序列元素或?qū)ο髮傩裕┨崛〉阶兞恐小?/p>
最簡(jiǎn)單的形式是將一個(gè)目標(biāo)值與一個(gè)或多個(gè)字面值進(jìn)行比較:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
注意最后一個(gè)代碼塊:“變量名” _ 被作為 通配符 并必定會(huì)匹配成功。 如果沒(méi)有 case 語(yǔ)句匹配成功,則不會(huì)執(zhí)行任何分支。
使用 | (“ or ”)在一個(gè)模式中可以組合多個(gè)字面值:
case 401 | 403 | 404:
return "Not allowed"
模式的形式類(lèi)似解包賦值,并可被用于綁定變量:
# point is an (x, y) tuple
match point:
case (0, 0):
print("Origin")
case (0, y):
print(f"Y={y}")
case (x, 0):
print(f"X={x}")
case (x, y):
print(f"X={x}, Y={y}")
case _:
raise ValueError("Not a point")
請(qǐng)仔細(xì)研究此代碼! 第一個(gè)模式有兩個(gè)字面值,可以看作是上面所示字面值模式的擴(kuò)展。但接下來(lái)的兩個(gè)模式結(jié)合了一個(gè)字面值和一個(gè)變量,而變量 綁定 了一個(gè)來(lái)自目標(biāo)的值(point)。第四個(gè)模式捕獲了兩個(gè)值,這使得它在概念上類(lèi)似于解包賦值 (x, y) = point。
如果使用類(lèi)實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu),可在類(lèi)名后加一個(gè)類(lèi)似于構(gòu)造器的參數(shù)列表,這樣做可以把屬性放到變量里:
class Point:
x: int
y: int
def where_is(point):
match point:
case Point(x=0, y=0):
print("Origin")
case Point(x=0, y=y):
print(f"Y={y}")
case Point(x=x, y=0):
print(f"X={x}")
case Point():
print("Somewhere else")
case _:
print("Not a point")可在 dataclass 等支持屬性排序的內(nèi)置類(lèi)中使用位置參數(shù)。還可在類(lèi)中設(shè)置 __match_args__ 特殊屬性為模式的屬性定義指定位置。如果它被設(shè)為 ("x", "y"),則以下模式均為等價(jià)的,并且都把 y 屬性綁定到 var 變量:
Point(1, var) Point(1, y=var) Point(x=1, y=var) Point(y=var, x=1)
讀取模式的推薦方式是將它們看做是你會(huì)在賦值操作左側(cè)放置的內(nèi)容的擴(kuò)展形式,以便理解各個(gè)變量將會(huì)被設(shè)置的值。 只有單獨(dú)的名稱(chēng)(例如上面的 var)會(huì)被 match 語(yǔ)句所賦值。 帶點(diǎn)號(hào)的名稱(chēng) (例如 foo.bar)、屬性名稱(chēng)(例如上面的 x= 和 y=)或類(lèi)名稱(chēng)(通過(guò)其后的 "(...)" 來(lái)識(shí)別,例如上面的 Point)都絕不會(huì)被賦值。
模式可以任意地嵌套。例如,如果有一個(gè)由點(diǎn)組成的短列表,則可使用如下方式進(jìn)行匹配:
match points:
case []:
print("No points")
case [Point(0, 0)]:
print("The origin")
case [Point(x, y)]:
print(f"Single point {x}, {y}")
case [Point(0, y1), Point(0, y2)]:
print(f"Two on the Y axis at {y1}, {y2}")
case _:
print("Something else")
為模式添加成為守護(hù)項(xiàng)的 if 子句。如果守護(hù)項(xiàng)的值為假,則 match 繼續(xù)匹配下一個(gè) case 語(yǔ)句塊。注意,值的捕獲發(fā)生在守護(hù)項(xiàng)被求值之前:
match point:
case Point(x, y) if x == y:
print(f"Y=X at {x}")
case Point(x, y):
print(f"Not on the diagonal")
match 語(yǔ)句的其他特性:
- 與解包賦值類(lèi)似,元組和列表模式具有完全相同的含義,并且實(shí)際上能匹配任意序列。 但它們不能匹配迭代器或字符串。
- 序列模式支持?jǐn)U展解包操作:[x, y, *rest] 和 (x, y, *rest) 的作用類(lèi)似于解包賦值。 在 * 之后的名稱(chēng)也可以為 _,因此,(x, y, *_) 可以匹配包含至少兩個(gè)條目的序列,而不必綁定其余的條目。
- 映射模式:{"bandwidth": b, "latency": l} 從字典中捕獲 "bandwidth" 和 "latency" 的值。與序列模式不同,額外的鍵會(huì)被忽略。**rest 等解包操作也支持。但 **_ 是冗余的,不允許使用。
使用 as 關(guān)鍵字可以捕獲子模式:
case (Point(x1, y1), Point(x2, y2) as p2): ...
將把輸入的第二個(gè)元素捕獲為 p2 (只要輸入是包含兩個(gè)點(diǎn)的序列)
大多數(shù)字面值是按相等性比較的,但是單例對(duì)象 True, False 和 None 則是按標(biāo)識(shí)號(hào)比較的。
模式可以使用命名常量。 這些命名常量必須為帶點(diǎn)號(hào)的名稱(chēng)以防止它們被解讀為捕獲變量:
from enum import Enum
class Color(Enum):
RED = 'red'
GREEN = 'green'
BLUE = 'blue'
color = Color(input("Enter your choice of 'red', 'blue' or 'green': "))
match color:
case Color.RED:
print("I see red!")
case Color.GREEN:
print("Grass is green")
case Color.BLUE:
print("I'm feeling the blues :(")到此這篇關(guān)于Python match語(yǔ)句的具體使用的文章就介紹到這了,更多相關(guān)Python match內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django 實(shí)現(xiàn)圖片上傳和顯示過(guò)程詳解
這篇文章主要介紹了Django 實(shí)現(xiàn)圖片上傳和顯示過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
Python操作MySQL簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了Python操作MySQL簡(jiǎn)單實(shí)現(xiàn)方法,通過(guò)一個(gè)簡(jiǎn)單的實(shí)例講述了Python針對(duì)mysql數(shù)據(jù)庫(kù)的增刪改查技巧,需要的朋友可以參考下2015-01-01
python辦公自動(dòng)化之讀取本地OUTLOOK客戶(hù)端郵件
這篇文章主要為大家詳細(xì)介紹了如何使用python實(shí)現(xiàn)讀取本地OUTLOOK客戶(hù)端郵件,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以了解下2023-10-10
使用Pandas實(shí)現(xiàn)MySQL窗口函數(shù)的解決方法
本文主要介紹 MySQL 中的窗口函數(shù)row_number()、lead()/lag()、rank()/dense_rank()、first_value()、count()、sum()如何使用pandas實(shí)現(xiàn),同時(shí)二者又有什么區(qū)別,感興趣的朋友一起看看吧2023-02-02
10個(gè)Python中python_docx庫(kù)的實(shí)用案例分享
在日常辦公和文檔處理中,Word文檔是我們最常用的格式之一,Python通過(guò)python?-?docx庫(kù)能夠?qū)崿F(xiàn)對(duì)Word文檔的各種自動(dòng)化操作,本文為大家準(zhǔn)備了10個(gè)常用的案例,希望對(duì)大家有所幫助2025-02-02
Matplotlib子圖的創(chuàng)建的實(shí)現(xiàn)
本文主要介紹了Matplotlib子圖的創(chuàng)建的實(shí)現(xiàn),包括fig.add_axes()創(chuàng)建子圖和plt.axes創(chuàng)建子圖這兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11
Python工程師面試題 與Python Web相關(guān)
這篇文章主要為大家分享了Python工程師面試題,面試題的內(nèi)容主要與Python Web相關(guān),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01
Django模塊學(xué)習(xí)之模塊語(yǔ)言詳解
模板語(yǔ)言渲染的整個(gè)過(guò)程其實(shí)就是將html轉(zhuǎn)換成函數(shù),并為該函數(shù)提供全局變量,然后執(zhí)行該函數(shù),下面這篇文章主要給大家介紹了關(guān)于Django模塊學(xué)習(xí)之模塊語(yǔ)言的相關(guān)資料,需要的朋友可以參考下2021-11-11

