Python match-case 语句基础
中等9用 match-case 快速匹配固定值:像“找卡片”一样简单
同学们,当我们需要根据一个变量的不同值来执行不同的操作时,除了用 if-elif-else,Python 从 3.10 版本开始还给我们提供了一个更“帅气”的工具——match-case。它就像你玩“找对应卡片”的游戏:你手里有一个值(比如数字 3),然后看看它和哪张“卡片”(比如 case 3:)匹配,就执行那张卡片上的指令。match-case 特别适合用来判断几种已知的固定情况,比如星期几、水果颜色、考试成绩等级等,它能让代码像发卡一样整齐地排好,一目了然。
1. 先来看看 match-case 长什么样
match-case 的语法结构很清晰,记住四个步骤:
- 第一行:写
match关键字,后面跟上你要判断的变量(比如day),最后加一个冒号:。 - 第二行开始:缩进(按 Tab 或 4个空格)写多个
case分支。 - 每个
case分支:先写case,再写一个你想匹配的值(比如case 3:),然后加冒号,再缩进写要执行的代码。 - 最后可以加一个可选的
case _:,它就像一个万能“兜底”的卡片,如果前面所有卡片都没匹配上,就走它(类似if-else中的else)。
match 变量:
case 值1:
执行代码1
case 值2:
执行代码2
# ... 更多 case
case _: # 注意:下划线 _ 表示“任何其他值”
兜底代码
2. 生活小例子:星期几翻译器
假设你用数字 17 代表星期一星期日,现在拿到一个数字,想知道它对应星期几。用 match-case 写起来就像在念卡片一样清晰:
# 星期几的数字
day = 3
match day:
case 1:
print("星期一")
case 2:
print("星期二")
case 3:
print("星期三")
case 4:
print("星期四")
case 5:
print("星期五")
case 6:
print("星期六")
case 7:
print("星期日")
case _:
print("没有这个星期几")
因为 day = 3,程序会匹配到 case 3:,然后打印“星期三”。如果你把 day 改成 8,就走最后的 case _:,打印“没有这个星期几”。
3. 多个值匹配同一个结果:用竖线 |
有时候,好几个不同的值要执行同样的操作。比如,你想知道今天是工作日还是周末。周末是星期六(6)和星期日(7),其他都是工作日。你可以用竖线 | 把多个值写在一起,表示“或”的关系:
# 星期几的数字
day = 7
match day:
case 1 | 2 | 3 | 4 | 5: # 周一到周五
print("工作日,要好好学习!")
case 6 | 7: # 周六和周日
print("周末啦,可以放松一下!")
case _:
print("没有这个星期几")
这样写比写五个 case 1:、case 2:……节省好多行,而且意思很清楚:只要 day 是 1 到 5 中的任意一个,就执行第一个分支。
4. 更贴近生活的例子:零花钱买零食
小红每天拿到零花钱,她想根据零花钱的数量来决定买什么零食:
- 如果零花钱少于 5 元 → 买一根棒棒糖
- 如果零花钱是 5 元或 10 元 → 买一包薯片
- 如果零花钱是 20 元 → 买一个汉堡
- 其他金额 → 不确定买什么
用 match-case 怎么写呢?注意!case 后面只能直接写固定的值(字面量),不能写 case < 5: 这样的比较。但是我们可以先把金额映射成“分类值”。不过这里为了简单,我们假设零花钱只有几种固定面值:1元、5元、10元、20元。
# 小红的零花钱金额(单位:元)
money = 5
match money:
case 1:
print("买一根棒棒糖")
case 5 | 10: # 5元或10元都买薯片
print("买一包薯片")
case 20:
print("买一个汉堡")
case _:
print("不知道买什么,先存起来吧")
因为 money = 5,匹配到 case 5 | 10:,所以输出“买一包薯片”。
5. 完整可运行的示例:根据成绩等级给评语
假设你考试后得到一个等级(A、B、C、D),用 match-case 给出评语:
# 学生考试等级(大写字母)
grade = "B"
match grade:
case "A":
print("优秀!继续加油!")
case "B":
print("良好!还可以更好哦。")
case "C":
print("及格了,需要多努力!")
case "D":
print("不及格,要好好复习啦!")
case _:
print("没有这个等级")
运行结果:输出“良好!还可以更好哦。”
6. 新手经常犯的错误
错误1:忘记冒号
比如写成 case 3 后面没有冒号,Python 会报语法错误。记住:case 值: 后面一定要有冒号。
错误2:case 后面的值写成了变量
比如你写:
num = 5
match num:
case num: # 错误!这里不能用变量名,case后面只能是固定的值
...
case 后面只能写具体的常量(比如数字、字符串),不能写变量名。因为 match-case 是“模式匹配”,变量名会被解释成“绑定任何值”,和你想表达的意思不一样。所以如果要用变量,还是用 if-elif-else。
错误3:把 case _ 写在了前面
case _ 是兜底分支,必须放在所有其他 case 的最后,否则它后面的 case 永远不会被执行。
错误4:match 后面的变量类型不统一
比如变量是整数,但 case 里却写字符串,这样永远不会匹配成功,最后会走 case _。虽然不会报错,但逻辑可能不是你想要的。
7. 对比 if-elif-else:什么时候用哪个?
同样是星期几的例子,用 if-elif-else 写出来是:
day = 3
if day == 1:
print("星期一")
elif day == 2:
print("星期二")
elif day == 3:
print("星期三")
# ... 后面还要写很多个 elif ...
else:
print("没有这个星期几")
可以看到每个分支都要写 day ==,重复很多,而且如果你要匹配多个值,还得写 day == 1 or day == 2。相比之下,match-case 更简洁、更整齐,一眼就能看出有哪些“卡片”。
建议:当你要判断的全是固定的几个值(比如星期几、水果颜色、菜单选项)时,优先用 match-case;如果判断条件是比较大小(比如 score > 60)或者更复杂的情况,就用 if-elif-else。
8. 小挑战(保留并修改)
用 match-case 写一个程序:输入一个字母(元音字母 a, e, i, o, u),输出“这是元音”;其他字母输出“这是辅音”。提示:可以用 case "a" | "e" | "i" | "o" | "u": 这样的写法。注意大小写怎么办?你可以先统一转换成小写再匹配。
# 待挑战的代码框架
letter = input("请输入一个英文字母: ")
letter = letter.lower() # 转成小写,减少判断
match letter:
case "a" | "e" | "i" | "o" | "u":
print("这是元音")
case _:
print("这是辅音")
试一试吧!
9. 相关知识点指引
- 学习过
if-elif-else的同学可以对比两种写法的异同。(可以看本知识库的《Python if-elif-else 语句》) - 想要更深入地学习
match-case的高级用法(比如匹配列表、守卫条件)?可以搜索“Python match-case 模式匹配”。 - 如果你还不熟悉变量、输入、输出,建议先学习《Python 基础输入输出》。
match-case 就像一本整齐的“说明书”,把各种不同的情况分门别类列出来,让代码读起来像讲故事一样轻松。快去试试用它解决生活中的小问题吧!
例题精讲
以下哪个Python代码片段正确使用了match-case语句?(假设x已定义)
在match-case语句中,如果想要在同一个case分支中匹配多个不同的值(例如1或2),应该使用哪个符号连接?
在match-case语句中,使用下划线_作为通配符可以匹配任何值,通常作为默认情况使用。
以下代码根据变量day的值输出对应英文星期,请填空使得当day不在1-7范围内时输出"Invalid"。
day = 8
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")以下代码根据变量score(整数)输出等级,请填空使得当score为90或100时输出"A",当score为80时输出"B",否则输出"C"。
score = 90
match score:
case 90 | 100: print("A")
case 80: print("B")
case ___: print("C")