python3.10
增加了采用模式加上相应动作的 match 语句 和 case 语句 的形式的结构化模式匹配。 模式由序列、映射、基本数据类型以及类实例构成。 模式匹配使得程序能够从复杂的数据类型中提取信息、根据数据结构实现分支,并基于不同的数据形式应用特定的动作。
语法与操作
•模式匹配的通用语法如下:
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _:
<action_wildcard>
match
语句接受一个表达式并将其值与以一个或多个 case 语句块形式给出的一系列模式进行比较。 具体来说,模式匹配的操作如下:
•使用具有特定类型和形状的数据 (subject)•针对 subject 在 match 语句中求值•从上到下对 subject 与 case 语句中的每个模式进行比较直到确认匹配到一个模式。•执行与被确认匹配的模式相关联的动作。•如果没有确认到一个完全的匹配,则如果提供了使用通配符 _ 的最后一个 case 语句,则它将被用作已匹配模式。 如果没有确认到一个完全的匹配并且不存在使用通配符的 case 语句,则整个 match 代码块不执行任何操作。
简单模式:匹配一个字面值
让我们把这个例子看作是模式匹配的最简单形式:一个值,即主词,被匹配到几个字面值,即模式。在下面的例子中,status 是匹配语句的主词。模式是每个 case 语句,字面值代表请求状态代码。匹配后,将执行与该 case 相关的动作:
def http_error(status):
match status:
case 400:
return "请求错误!"
case 404:
return "页面不存在!"
case 418:
return "yyds!"
case _:
return "网络有点问题!"
if __name__ == '__main__':
print(http_error(500))
运行结果
网络有点问题!
Process finished with exit code 0
如果传给上述函数的 status
为 418
,则会返回 "yyds!"
。 如果传给上述函数的 status
为 500
,则带有_
的 case
语句将作为通配符匹配,并会返回 "网络有点问题!"。
请注意最后一个代码块:变量名_
将作为 通配符 并确保目标将总是被匹配。_
的使用是可选的。
•你可以使用 | (“ or ”)
在一个模式中组合几个字面值:
def http_error(status):
match status:
case 400 | 404 | 403:
return "请求错误!"
case _:
return "网络有点问题!"