CC++ & Algorithm

Python match-case 语句基础

中等9
语言版本:C++Python
概述:像发卡一样快速匹配固定值,match-case 让多条件判断更简洁清晰,适合判断几种已知的情况。

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 变量:
    case1:
        执行代码1
    case2:
        执行代码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 就像一本整齐的“说明书”,把各种不同的情况分门别类列出来,让代码读起来像讲故事一样轻松。快去试试用它解决生活中的小问题吧!

例题精讲

1单选题

以下哪个Python代码片段正确使用了match-case语句?(假设x已定义)

Amatch x:\n case 1: print("one")\n case 2: print("two")\n case _: print("other")
Bmatch x:\n case 1: print("one")\n case 2: print("two")\n default: print("other")
Cmatch x:\n case 1 print("one")\n case 2 print("two")\n case _: print("other")
Dmatch x:\n case 1: print("one"); case 2: print("two"); case _: print("other")
2单选题

在match-case语句中,如果想要在同一个case分支中匹配多个不同的值(例如1或2),应该使用哪个符号连接?

A&
B|
C,
Dor
3判断题

在match-case语句中,使用下划线_作为通配符可以匹配任何值,通常作为默认情况使用。

4填空题
以下代码根据变量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")
5填空题
以下代码根据变量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")