Python match-case 语句
困难6用 match-case 做多路选择:像自助餐一样选菜
当你需要根据一个变量的不同取值,执行不同的代码时,如果选项很多,写一堆 if-elif-else 会变得又长又乱。Python 3.10 之后加入的 match-case 语句,就像自助餐的菜品展示区——你端着盘子(变量)走到一个摊位(case),厨师就给你打菜(执行代码)。如果找不到对应的摊位,就去最后的“其他摊位”(case _)。它让代码更清晰、更容易阅读。
基本格式
match 变量:
case 值1:
处理1
case 值2:
处理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",就会提示无效。
常见错误(新手容易踩的坑)
-
忘记冒号
每个case后面必须跟冒号,和if、for一样。
错误:case 1→ 正确:case 1: -
缩进不统一
match和里面的case要对齐,每个case下面的代码块要再缩进一层。
错误:match x: case 1: print("一") # 缩进不对正确:
match x: case 1: print("一") -
通配符
_放错位置
case _必须放在所有case的最后,否则它后面的case永远不会被匹配到。
错误:match day: case _: print("其他") case 0: print("星期一") # 这句永远不会执行 -
Python 版本过低
match-case是 Python 3.10 才加入的特性。如果你用的是 3.9 或更早版本,运行会报语法错误。
解决办法:升级 Python 到 3.10 以上,或者使用if-elif-else代替。 -
混淆
=和:
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]:可以匹配两个元素的列表。那是更高阶的用法,等学到数据结构时再探索吧。
例题精讲
以下Python代码执行后,输出结果是什么? x = 1 match x: case 0: print("零") case 1: print("一") case _: print("其他")
在Python的match-case语句中,下划线_只能放在最后一个case作为默认匹配。
完善以下代码,当变量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")关于match-case语句中的守卫(guard),以下哪个代码片段的语法正确?
以下代码使用match-case根据变量x的值输出不同信息:当x为1、2或3时输出"小数字",当x为4、5或6时输出"中数字",否则输出"大数字"。请补充完整。
x = 3
match x:
case ___:
print("小数字")
case 4 | 5 | 6:
print("中数字")
case _:
print("大数字")