match 语句在 2021 年 Python 3.10 发布时加入,又可称为 match case 语句。该语句的基础形式有点像 C 语言的 switch 语句,属于另外一种选择语句。但通过复杂的模式匹配,该语句要更强大,能更方便我们控制程序流。以下是其基础形式的示例:
match number:
case 1:
print('1 朵:你是我的唯一')
case 2:
print('2 朵:世界只有你和我')
case 3:
print('3 朵:我爱你')
case 10:
print('10 朵:十全十美')
case _:
print('其他美好的愿望')
match 语句将 match 关键字后面的表达式与每个 case 关键字后面的模式进行对比,如果找到第一个匹配(如相等)的模式,则执行该分支,剩下的分支将不再执行。
名称为 _ 的变量为通配符,它必定会匹配成功。其作用类似于 if-elif-else 语句中的 else 分支。该分支必须作为最后一个分支放置。
在一些情况下,相对于多分支的 if,match 语句显得更整洁。
可以使用竖线 |(意思为“或”)在一个模式中组合多个字面值,见下页示例。
cny_unit_name = '角'
match cny_unit_name:
case '元' | '圆' | '块':
cny_unit_value = 1.0
case '角' | '毛':
cny_unit_value = 0.1
case '分':
cny_unit_value = 0.01
case '厘':
cny_unit_value = 0.001
case '毫':
cny_unit_value = 0.0001
case _:
cny_unit_value = 0.0
possession = 3.33 # 默认以“元”为单位
print(f'我的个人财产为 {possession / cny_unit_value:.2f} {cny_unit_name}。')
# 我的个人财产为 33.30 角。
以上示例将个人资产值 possession 换算为其他人民币单位名称 cny_unit_name 对应的值。
选学 » 模式的形式类似解包赋值,并可被用于绑定变量:
point = (0, 1) # point 是一个 (x, y) 形式的元组
match point:
case (0, 0):
print("坐标原点")
case (0, y):
print(f"Y={y}") # 注意元组的第 2 个元组被绑定到变量 y 上
case (x, 0):
print(f"X={x}") # 注意元组的第 1 个元组被绑定到变量 x 上
case (x, y):
print(f"X={x}, Y={y}") # 注意元组的两个元素被绑定到 (x, y) 的两个元素上
case _:
raise ValueError("不是一个点") # 前面都无法匹配,说明 point 不是 (x, y) 形式的元组
使用 match 进行模式匹配还有更多高级的用法,这里不再介绍。