Switch
語句存在于很多編程語言中产喉,但 Python
編程語言不支持 Switch
語句。早在 2016 年敢会,PEP 3103 就被提出曾沈,建議 Python
支持 switch-case
語句。然而鸥昏,在調(diào)查中發(fā)現(xiàn)很少人支持該特性塞俱,Python
開發(fā)人員放棄了它。
時(shí)間在推到 2020 年吏垮,Python
的創(chuàng)始人 Guido van Rossum障涯,提交了顯示 switch
語句的第一個(gè)文檔,命名為 Structural Pattern Matching
膳汪,見 PEP 634
唯蝶。
如今,隨著Python 3.10 beta
版的發(fā)布遗嗽,終于將 switch-case
語句納入其中粘我。
不過在python
中使用的是match-case
PEP 634
結(jié)構(gòu)模式匹配:模式匹配允許用戶在match
后面跟隨數(shù)個(gè) case
語句。當(dāng)在程序執(zhí)行 match-case
時(shí)痹换,有匹配的語句征字,程序就會進(jìn)入相應(yīng)的 case
語句來執(zhí)行操作都弹。
match-case
語法和操作:模式匹配的通用語法是:
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _:
<action_wildcard>
match
語句接受一個(gè)表達(dá)式,并將其值與作為一個(gè)或多個(gè) case
塊給出的連續(xù)模式進(jìn)行比較匙姜。match-case
示例如下:
http_code = "418"
match http_code:
case "200":
print("OK")
do_something_good()
case "404":
print("Not Found")
do_something_bad()
case "418":
print("I'm a teapot")
make_coffee()
case _:
print("Code not found")
下圖是 match-case
語句執(zhí)行示意圖畅厢。程序會檢查多個(gè) case
條件,并根據(jù)在變量 http_code
中找到的值執(zhí)行不同的操作氮昧。
同樣的框杜,你也可以使用一組if-elif-else
語句來構(gòu)建相同的邏輯:
http_code = "418"
if http_code == "418":
print("OK")
do_something_good()
elif http_code == "404":
print("Not Found")
do_something_bad()
elif http_code == "418"
print("I'm a teapot")
make_coffee()
else:
print("Code not found")
然而,通過使用 match-case
語句郭计,刪除了 http_code ==
的重復(fù)執(zhí)行霸琴,當(dāng)測試許多不同的條件時(shí)使用 match-case
,http_code ==
看起來更加清晰昭伸。
我們可以通過一個(gè)簡單的例子來了解模式匹配:用 C
梧乘、Java
或 JavaScript
(以及許多其他語言)中的 switch
語句將對象(數(shù)據(jù)對象)與文本(模式)進(jìn)行匹配。switch
語句通常用于將對象 / 表達(dá)式與包含文字的 case
語句進(jìn)行比較庐杨。
雖然使用嵌套 if
語句的命令式指令系列可以用來完成類似于結(jié)構(gòu)模式匹配的任務(wù)选调,但它不如聲明式方法那么清晰。相反灵份,聲明性方法聲明了匹配所需滿足的條件仁堪,并且通過其顯式模式更具可讀性。雖然結(jié)構(gòu)模式匹配可以以最簡單的形式使用填渠,將變量與 case
語句中的文本進(jìn)行比較弦聂,但它對 Python
的真正價(jià)值在于它對對象類型和大小的處理。
match-case
可以說是此次 Python 3.10 beta
版本最大的亮點(diǎn)氛什。對于這種表達(dá)式莺葫,有人喜歡,有人憎惡枪眉。在 Python
還不支持 switch-case
之前捺檬,大家可能都是使用字典進(jìn)行相關(guān)操作。有人說switch
除了讀著方便贸铜,沒什么優(yōu)點(diǎn)堡纬;還有人說Python
的閉包機(jī)制,dict
的 value
可以是帶閉包的函數(shù)蒿秦,這樣就使得表達(dá)能力比 switch-case
更上一層樓烤镐;但總歸 Python 3.10 beta
版本納入了 switch-case
,為開發(fā)者提供了另一種選擇棍鳖。