8. match-case 模式匹配

match-casePython 3.10+ 新增的语法,用于固定值匹配、多选项分流,比大量 elif 更简洁易读。

💡 生活类比

想象机场安检口:普通旅客走 A 通道,头等舱走 VIP 通道,特殊旅客走绿色通道。工作人员只需看你的信息符合哪个模板,就走对应通道——这就是模式匹配

基础语法

python
match 数据:
    case 模式1:
        执行代码
    case 模式2:
        执行代码
    case _:       # 通配符,相当于 else
        默认处理

五大核心知识点

语法说明类比
match 变量:数据入口,所有数据从这里进入安检口入口
case 值:逐个检查,匹配成功则执行检查窗口
case A | B:组合匹配,A 或 B 都执行同一段代码多通道合并
case 值 if 条件:条件守卫(Guard):先匹配值,再检查额外条件门口保安
case _:通配符,前面都不匹配时的默认兜底其他通道

组合匹配示例

python
def classify_operator(operator):
    match operator:
        case "+" | "-":
            return "一级运算(加减)"
        case "*" | "/":
            return "二级运算(乘除)"
        case _:
            return "未知运算符"

print(classify_operator("+"))  # 一级运算(加减)
print(classify_operator("*"))  # 二级运算(乘除)

▶ 运行结果:

输出
一级运算(加减)
二级运算(乘除)

条件守卫示例:安全计算器

条件守卫 case "/" if b != 0: 先匹配除法运算符,再检查除数是否合法。

python
def safe_calculator(operator, a, b):
    match operator:
        case "+":
            return f"{a} + {b} = {a + b}"
        case "-":
            return f"{a} - {b} = {a - b}"
        case "*":
            return f"{a} × {b} = {a * b}"
        case "/" if b != 0:   # 条件守卫:先匹配"/",再检查b≠0
            return f"{a} ÷ {b} = {a / b}"
        case "/":             # b = 0 的情况(上面匹配失败走到这里)
            return "错误:除数不能为0"
        case _:
            return "不支持的运算符"

print(safe_calculator("+", 10, 5))   # 10 + 5 = 15
print(safe_calculator("/", 20, 0))   # 错误:除数不能为0
print(safe_calculator("%", 20, 5))   # 不支持的运算符

▶ 运行结果:

输出
10 + 5 = 15
错误:除数不能为0
不支持的运算符

match-case vs if-elif 对比

对比项match-caseif-elif
固定值匹配✅ 非常适合可以实现
多选项分流✅ 非常简洁容易写成长串 elif
范围判断❌ 不适合✅ 非常适合
复杂逻辑条件一般✅ 最擅长
代码可读性分支多时更整洁分支多时较差
💡 选择原则

固定值匹配(如 + - * /)→ 用 match-case

范围判断(如 score >= 90)→ 用 if 语句