Switch
语句存在于很多编程语言中,但 Python
编程语言不支持 Switch
语句。早在 2016 年,PEP 3103 就被提出,建议 Python
支持 switch-case
语句。然而,在调查中发现很少人支持该特性,Python
开发人员放弃了它。
时间在推到 2020 年,Python
的创始人 Guido van Rossum,提交了显示 switch
语句的第一个文档,命名为 Structural Pattern Matching
,见 PEP 634
。
如今,随着Python 3.10 beta
版的发布,终于将 switch-case
语句纳入其中。
不过在python
中使用的是match-case
PEP 634
结构模式匹配:模式匹配允许用户在match
后面跟随数个 case
语句。当在程序执行 match-case
时,有匹配的语句,程序就会进入相应的 case
语句来执行操作。
match-case
语法和操作:模式匹配的通用语法是:
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _:
<action_wildcard>
match
语句接受一个表达式,并将其值与作为一个或多个 case
块给出的连续模式进行比较。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
语句执行示意图。程序会检查多个 case
条件,并根据在变量 http_code
中找到的值执行不同的操作。
同样的,你也可以使用一组if-elif-else
语句来构建相同的逻辑:
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 ==
的重复执行,当测试许多不同的条件时使用 match-case
,http_code ==
看起来更加清晰。
我们可以通过一个简单的例子来了解模式匹配:用 C
、Java
或 JavaScript
(以及许多其他语言)中的 switch
语句将对象(数据对象)与文本(模式)进行匹配。switch
语句通常用于将对象 / 表达式与包含文字的 case
语句进行比较。
虽然使用嵌套 if
语句的命令式指令系列可以用来完成类似于结构模式匹配的任务,但它不如声明式方法那么清晰。相反,声明性方法声明了匹配所需满足的条件,并且通过其显式模式更具可读性。虽然结构模式匹配可以以最简单的形式使用,将变量与 case
语句中的文本进行比较,但它对 Python
的真正价值在于它对对象类型和大小的处理。
match-case
可以说是此次 Python 3.10 beta
版本最大的亮点。对于这种表达式,有人喜欢,有人憎恶。在 Python
还不支持 switch-case
之前,大家可能都是使用字典进行相关操作。有人说switch
除了读着方便,没什么优点;还有人说Python
的闭包机制,dict
的 value
可以是带闭包的函数,这样就使得表达能力比 switch-case
更上一层楼;但总归 Python 3.10 beta
版本纳入了 switch-case
,为开发者提供了另一种选择。