CC++ & Algorithm

Python match-case 语句

困难6
语言版本:C++Python
概述:用match-case让程序从多种可能中选择一种执行,类似自助餐选菜。

用 match-case 做多路选择:像自助餐一样选菜

当你需要根据一个变量的不同取值,执行不同的代码时,如果选项很多,写一堆 if-elif-else 会变得又长又乱。Python 3.10 之后加入的 match-case 语句,就像自助餐的菜品展示区——你端着盘子(变量)走到一个摊位(case),厨师就给你打菜(执行代码)。如果找不到对应的摊位,就去最后的“其他摊位”(case _)。它让代码更清晰、更容易阅读。

基本格式

match 变量:
    case1:
        处理1
    case2:
        处理2
    case _:
        其他情况

注意:每个 case 后面也要加冒号,代码块同样需要缩进(一般用 4 个空格)。最后的 _ 是一个通配符,表示“其他所有情况”,相当于 else

match-case 的匹配规则

1. 精确匹配:一个值对应一个结果

最常见的用法是让变量和某个固定值精确匹配。比如根据数字 0~6 输出星期几:

day = 3  # 整数,表示星期几
match day:
    case 0:
        print("星期一")
    case 1:
        print("星期二")
    case 2:
        print("星期三")
    case 3:
        print("星期四")
    case 4:
        print("星期五")
    case 5:
        print("星期六")
    case 6:
        print("星期日")
    case _:
        print("无效的日期")

因为 day 是 3,所以程序会打印“星期四”。如果 day 是 7,就会匹配最后的 case _,打印“无效的日期”。

2. 通配符 _:处理所有没列出的情况

_ 就像一张“万能通行证”,可以匹配任何值。通常把它放在所有 case 的最后,作为兜底选项。如果不写通配符,而变量又没匹配到任何一个 case,程序什么也不会执行(不会报错,但也没结果)。所以建议总是带上一个 case _: 来提醒自己——万一有意外值怎么办?

3. “或”匹配:多个值执行同一段代码

有时候好几个不同的值要执行相同的操作,比如判断颜色是不是三原色。这时可以用竖线 | 把多个值连起来,表示“或”:

color = "red"  # 字符串,表示颜色
match color:
    case "red" | "yellow" | "blue":
        print("这是三原色之一")
    case _:
        print("其他颜色")

只要 color"red""yellow""blue" 中的任意一个,就会打印“这是三原色之一”。这个用法能省掉很多重复的 case 行。

生活中的例子:自动售货机

想象你站在一台自动售货机前,按下按钮 A1、A2、A3……机器就会掉出对应的零食。用 match-case 描述这个过程:

button = "A2"  # 字符串,用户按的按钮编号
match button:
    case "A1":
        print("出货:薯片")
    case "A2":
        print("出货:巧克力")
    case "A3":
        print("出货:可乐")
    case "A4":
        print("出货:饼干")
    case _:
        print("无效按钮,请重新选择")

如果按了 "A2",机器打印“出货:巧克力”。如果按了一个不存在的按钮比如 "B5",就会提示无效。

常见错误(新手容易踩的坑)

  1. 忘记冒号
    每个 case 后面必须跟冒号,和 iffor 一样。
    错误:case 1 → 正确:case 1:

  2. 缩进不统一
    match 和里面的 case 要对齐,每个 case 下面的代码块要再缩进一层。
    错误:

    match x:
    case 1:
    print("一")   # 缩进不对
    

    正确:

    match x:
        case 1:
            print("一")
    
  3. 通配符 _ 放错位置
    case _ 必须放在所有 case 的最后,否则它后面的 case 永远不会被匹配到。
    错误:

    match day:
        case _:
            print("其他")
        case 0:
            print("星期一")   # 这句永远不会执行
    
  4. Python 版本过低
    match-case 是 Python 3.10 才加入的特性。如果你用的是 3.9 或更早版本,运行会报语法错误。
    解决办法:升级 Python 到 3.10 以上,或者使用 if-elif-else 代替。

  5. 混淆 =:
    case 后面跟的是值,用 : 结束,不是 =

完整可运行示例

下面是一个结合了星期几和游戏指令的完整程序,你可以直接复制到 Python 3.10+ 的环境中运行:

# 根据输入的数字或命令执行不同操作
day_num = 3  # 整数,代表星期几
command = "attack"  # 字符串,游戏中的指令

# 处理星期
print("===== 星期判断 =====")
match day_num:
    case 0:
        print("星期一:上学日")
    case 1:
        print("星期二:正常上课")
    case 2:
        print("星期三:期中考试")
    case 3:
        print("星期四:体育课")
    case 4:
        print("星期五:快乐星期五")
    case 5:
        print("星期六:放假啦!")
    case 6:
        print("星期日:准备上学")
    case _:
        print("无效的星期数字")

# 处理游戏指令
print("\n===== 游戏指令 =====")
match command:
    case "attack":
        print("你挥剑攻击敌人!")
    case "defend":
        print("你举起盾牌防御!")
    case "magic":
        print("你念咒语释放魔法!")
    case "run":
        print("你转身逃跑!")
    case _:
        print("未知指令,请重新输入")

运行结果:

===== 星期判断 =====
星期四:体育课

===== 游戏指令 =====
你挥剑攻击敌人!

相关知识点

  • if-elif-else 语句match-case 的替代方案,适合条件较简单或需要复杂逻辑判断的情况。
  • 条件判断match-case 只能做等值匹配(等于某个值),不能像 if 那样写 x > 5。如果需要范围或关系比较,还是得用 if
  • Python 版本升级:如果你还没用过 3.10 的新特性,可以学习一下如何用 pyenv 或官网安装包升级。
  • 数据结构解构(进阶):match-case 还支持匹配列表、元组、字典甚至自定义类的结构,比如 case [x, y]: 可以匹配两个元素的列表。那是更高阶的用法,等学到数据结构时再探索吧。

例题精讲

1单选题

以下Python代码执行后,输出结果是什么? x = 1 match x: case 0: print("零") case 1: print("一") case _: print("其他")

A
B
C其他
D报错
2判断题

在Python的match-case语句中,下划线_只能放在最后一个case作为默认匹配。

3填空题
完善以下代码,当变量day的值为1~7时输出对应的英文星期名称,其他值输出"Invalid"。
day = 3
match day:
    case 1:
        print("Monday")
    case 2:
        print("Tuesday")
    case 3:
        print("Wednesday")
    case 4:
        print("Thursday")
    case 5:
        print("Friday")
    case 6:
        print("Saturday")
    case 7:
        print("Sunday")
    case ___:
        print("Invalid")
4单选题

关于match-case语句中的守卫(guard),以下哪个代码片段的语法正确?

Acase x if x > 0:
Bcase x if x > 0;
Ccase x if > 0:
Dcase x: if x > 0:
5填空题
以下代码使用match-case根据变量x的值输出不同信息:当x为1、2或3时输出"小数字",当x为4、5或6时输出"中数字",否则输出"大数字"。请补充完整。
x = 3
match x:
    case ___:
        print("小数字")
    case 4 | 5 | 6:
        print("中数字")
    case _:
        print("大数字")