match 语句

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 分支。该分支必须作为最后一个分支放置。

在一些情况下,相对于多分支的 ifmatch 语句显得更整洁。

可以使用竖线 |(意思为“或”)在一个模式中组合多个字面值,见下页示例。

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 进行模式匹配还有更多高级的用法,这里不再介绍。

if 语句while 语句