CC++ & Algorithm

Python match-case语句

困难0
语言版本:C++
概述:像按按钮选择不同功能,match-case让多种情况清晰明了。

用 match-case 让多分支选择更清晰

在编写程序时,我们经常需要根据一个变量的值,从多个选项中挑一个来执行。比如按数字键选择游戏模式、根据分数判断等级。Python 3.10 版本新增了 match-case 语句,它就像遥控器上的多个功能按钮——按1开电视,按2开空调,清晰又简单。


一、match-case 的基本用法

match-case 的写法很像开关选择:先写 match 变量,然后用 case 值: 列出每一种可能的情况。如果变量的值等于某个 case 后面的值,就执行那个 case 下面的代码。

举个例子,根据用户输入的数字(1~7)输出对应的星期几:

# 输入数字,判断星期几
day = int(input("请输入数字(1-7):"))
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("输入错误,请输入1-7的数字")
  • match day:告诉 Python 我们要检查变量 day 的值。
  • case 1::如果 day 等于 1,就执行下面的 print("星期一")
  • 最后一个 case _: 中的下划线 _ 是一个特殊的通配符,它匹配任何没有在前面被列出的值。这有点像遥控器上“其他”按钮,防止用户输入了非预期的数字。

这样写比用一连串的 if-elif 更直观,就像看菜单一样,每个选项都一目了然。


二、生活中的应用场景

场景1:按按钮选择游戏模式

小明有一台游戏机,按1进入冒险模式,按2进入竞赛模式,按3进入练习模式,按其他数字提示重新选择。用 match-case 可以这样写:

# 选择游戏模式
mode = int(input("请输入模式编号(1-冒险,2-竞赛,3-练习):"))
match mode:
    case 1:
        print("进入冒险模式,准备好打怪升级吧!")
    case 2:
        print("进入竞赛模式,和电脑比赛谁更快!")
    case 3:
        print("进入练习模式,先练练手吧。")
    case _:
        print("没有这个模式,请重新输入1~3。")

场景2:根据考试成绩评等级

考试分数通常分成“优、良、中、差”。如果用 if-elif 要写很多条件,而用 match-case 配合 |(竖线)可以匹配多个值:

# 根据分数输出等级
score = int(input("请输入你的分数(0-100):"))
match score:
    case 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100:
        print("优秀!真棒!")
    case 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89:
        print("良好,继续加油哦。")
    case 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74:
        print("及格,还需要努力!")
    case _:
        print("不及格,下次要加油!")

这里 case 90 | 91 | 92 | ... | 100: 表示如果分数等于其中任何一个数,就执行对应的代码。| 就像“或”的意思。不过这样写有点长,更好的办法是用 if 判断区间,但 match-case 对于精确值的匹配非常方便。


三、常见错误与注意事项

  1. 忘记写冒号
    case 1: 末尾的冒号不能丢,否则会报语法错误。

    case 1   # 错误!少了冒号
        print("星期一")
    
  2. 缩进错误
    case 下面的代码必须缩进(通常是4个空格)。如果缩进不一致,Python 会报错或执行不符合预期。

    match day:
        case 1:
        print("星期一")   # 错误!print应该再缩进一层
    
  3. 多个 case 的顺序
    match 会从上到下依次检查 case,一旦匹配就不再检查后面的。因此要把更具体的条件放前面,更通用的(比如 case _)放最后。

  4. 误用逗号代替 |
    如果想匹配多个值,不能用逗号分隔,必须用 |(竖线)。比如:

    case 1, 2:   # 错误!这会把1,2当作一个元组去匹配
        print("数字1或2")
    

    正确写法:

    case 1 | 2:
        print("数字1或2")
    
  5. 忘记 case _ 处理其他情况
    如果不写 case _,当用户输入不存在的值(比如8),程序会执行完 match 后什么也不做,不会提示错误。通常建议加一个兜底的 case _ 来处理意外输入。


四、完整可运行示例:点餐系统

下面是一个模拟餐厅点餐的程序,用户输入数字选择套餐,程序输出对应的菜品介绍。你可以复制到 Python 3.10+ 环境运行。

# 餐厅点餐系统
print("欢迎来到快乐餐厅!请选择套餐:")
print("1 - 汉堡套餐")
print("2 - 鸡腿套餐")
print("3 - 披萨套餐")
print("4 - 全家桶")

# 获取用户选择的数字
choice = int(input("请输入数字(1-4):"))

match choice:
    case 1:
        print("你选择了汉堡套餐,包含汉堡+薯条+可乐。")
    case 2:
        print("你选择了鸡腿套餐,包含香辣鸡腿+饮料+沙拉。")
    case 3:
        print("你选择了披萨套餐,包含9寸披萨+一杯果汁。")
    case 4:
        print("你选择了全家桶,里面有一整只炸鸡、鸡翅、薯条和汽水。")
    case _:
        print("没有这个选项,请重新输入1~4。")

运行一下,输入1试试看吧!


五、相关知识点指引

  • if-elif-else 语句match-case 可以代替许多 if-elif,但条件判断(比如判断范围)用 if 更方便。了解两者的区别和适用场景。
  • 模式匹配(高级)match-case 还支持匹配列表、元组、字典等复杂结构,比如 case [x, y]: 匹配两个元素的列表。这个在 CSP-J 中不常考,但以后用 Python 写算法时会遇到。
  • 循环与选择嵌套:可以在 case 里面再嵌套 ifmatch,实现更精细的控制。

如果你已经掌握了 match-case,可以继续学习循环语句(for、while)和函数的定义,让程序更强大。


小提示match-case 只能在 Python 3.10 及以上版本中使用。如果你用记事本或在线编译器,请确认版本。老版本的 Python 只能使用 if-elif 哦!

例题精讲

1单选题

下列关于Python中match-case语句的说法,错误的是?

Amatch-case语句是Python 3.10版本开始引入的
Bmatch-case语句中的每个case分支执行后会自动跳出,无需break语句
Cmatch-case语句只能用于整型值的匹配,不能用于字符串匹配
Dmatch-case语句可以使用下划线_作为通配符匹配任何值
2单选题

执行以下代码后,输出结果为? value = 3 match value: case 1: print("one") case 2: print("two") case _: print("other")

Aone
Btwo
Cother
D报错
3判断题

在match-case语句中,可以使用字面量(如数字、字符串)直接作为匹配模式。

4填空题
以下代码使用match-case语句根据数字1~7输出对应星期几的中文名称,其中1对应“周一”,2对应“周二”,以此类推,其他数字输出“无效”。请补全代码。

day = 5
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("无效")
5填空题
以下程序片段使用match-case判断用户输入的命令(字符串),若为"quit"则退出程序(用exit()),若为"help"则打印帮助信息,否则打印"未知命令"。补全代码。

command = input()
match ___:
    case "quit":
        exit()
    case "help":
        print("帮助信息...")
    case _:
        print("未知命令")