跳到主要内容

模式匹配

1. match 语句基本概念

为什么使用 match?

当用 if ... elif ... elif ... else ... 判断时,代码冗长,可读性差。match 语句可以针对某个变量匹配若干种情况,代码更简洁易读。

基本语法

match <变量>:
case <1>:
<执行1>
case <2>:
<执行2>
case _: # 匹配其他任何情况(必须放在最后)
<执行默认>

关键点

  • match 后跟要匹配的变量
  • case 后跟匹配的值
  • case _ 表示匹配任意值,必须放在最后
  • 每个 case 后必须有冒号 :
  • 执行语句需要缩进

2. 简单匹配

匹配单个值

score = 'B'

match score:
case 'A':
print('score is A.')
case 'B':
print('score is B.')
case 'C':
print('score is C.')
case _: # 匹配其他任何情况
print('score is ???.')

对比 if-elif-else

# 使用 if-elif-else(冗长)
if score == 'A':
print('score is A.')
elif score == 'B':
print('score is B.')
elif score == 'C':
print('score is C.')
else:
print('invalid score.')

# 使用 match-case(简洁)
match score:
case 'A':
print('score is A.')
case 'B':
print('score is B.')
case 'C':
print('score is C.')
case _:
print('invalid score.')

3. 复杂匹配

匹配多个值

使用 | 分隔多个值:

age = 15

match age:
case 10:
print('10 years old.')
case 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18:
print('11~18 years old.')
case 19:
print('19 years old.')
case _:
print('not sure.')

匹配范围(条件匹配)

使用 if 条件:

age = 15

match age:
case x if x < 10:
print(f'< 10 years old: {x}')
case 10:
print('10 years old.')
case 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18:
print('11~18 years old.')
case _:
print('not sure.')

绑定变量

case 中可以将匹配的值绑定到变量:

age = 8

match age:
case x if x < 10:
print(f'< 10 years old: {x}') # x 被赋值为 8
case _:
print('other')

4. 匹配列表

基本列表匹配

args = ['gcc', 'hello.c', 'world.c']

match args:
case ['gcc']:
print('gcc: missing source file(s).')
case ['gcc', file1, *files]:
print('gcc compile: ' + file1 + ', ' + ', '.join(files))
case ['clean']:
print('clean')
case _:
print('invalid command.')

列表匹配规则

  • case ['gcc']:匹配只有 'gcc' 一个元素的列表
  • case ['gcc', file1, *files]
    • 第一个元素必须是 'gcc'
    • 第二个元素绑定到 file1
    • 剩余元素(0个或多个)绑定到 *files
  • case ['clean']:匹配只有 'clean' 一个元素的列表
  • case _:匹配其他所有情况

列表匹配示例

# 示例1:匹配固定结构
args = ['gcc', 'hello.c']
match args:
case ['gcc', file]:
print(f'compile: {file}') # file = 'hello.c'
case _:
print('invalid')

# 示例2:匹配可变长度
args = ['gcc', 'a.c', 'b.c', 'c.c']
match args:
case ['gcc', file1, *files]:
print(f'first: {file1}') # file1 = 'a.c'
print(f'others: {files}') # files = ['b.c', 'c.c']
case _:
print('invalid')

# 示例3:匹配空列表
args = []
match args:
case []:
print('empty list')
case _:
print('not empty')

5. 匹配规则总结

匹配类型

匹配类型语法示例
单个值case 值:case 'A':
多个值case 值1|值2:case 1|2|3:
条件匹配case 变量 if 条件:case x if x < 10:
列表匹配case [元素1, 元素2]:case ['gcc', file]:
可变列表case [元素1, *rest]:case ['gcc', *files]:
任意匹配case _:case _:

匹配顺序

  • 从上往下匹配,遇到第一个匹配的 case 就执行
  • case _ 必须放在最后,否则会匹配所有情况

6. 常见操作速查

基本结构

match variable:
case value1:
do_something1()
case value2 | value3:
do_something2()
case x if condition:
do_something3(x)
case [pattern1, pattern2]:
do_something4()
case _:
do_default()

实际应用示例

# 示例1:成绩等级判断
score = 'B'
match score:
case 'A':
print('优秀')
case 'B':
print('良好')
case 'C':
print('及格')
case _:
print('不及格')

# 示例2:年龄分组
age = 25
match age:
case x if x < 18:
print('未成年')
case 18 | 19 | 20 | 21 | 22:
print('青年')
case x if 23 <= x < 60:
print('成年')
case _:
print('老年')

# 示例3:命令解析
command = ['delete', 'file1.txt', 'file2.txt']
match command:
case ['delete']:
print('错误:未指定文件')
case ['delete', *files]:
print(f'删除文件: {", ".join(files)}')
case ['create', name]:
print(f'创建: {name}')
case _:
print('未知命令')

7. match vs if-elif-else

对比

特性match-caseif-elif-else
可读性✅ 更清晰❌ 较冗长
匹配单个值✅ 简洁✅ 支持
匹配多个值| 语法❌ 需要多个 ==
列表匹配✅ 强大❌ 不支持
条件匹配✅ 支持✅ 支持
Python版本3.10+所有版本

使用建议

  • 简单值匹配:优先使用 match-case(Python 3.10+)
  • 复杂条件:可以使用 if-elif-else
  • 列表解析match-case 更强大

8. 快速记忆总结

  • 基本语法match 变量: + case 值: + case _:
  • 匹配方式
    • 单个值:case 'A':
    • 多个值:case 1|2|3:
    • 条件:case x if x < 10:
    • 列表:case ['gcc', file]:
    • 可变列表:case ['gcc', *files]:
  • 关键规则
    • case _ 必须放在最后
    • 从上往下匹配,第一个匹配就执行
    • 列表匹配可以绑定变量
  • 优势:代码更简洁,可读性更好,特别适合多值匹配和列表解析

9. 常见错误

错误1:case _ 位置错误

# ❌ 错误:case _ 不能放在前面
match score:
case _:
print('default')
case 'A':
print('A')

# ✅ 正确:case _ 必须放在最后
match score:
case 'A':
print('A')
case _:
print('default')

错误2:忘记冒号

# ❌ 错误
match score:
case 'A'
print('A')

# ✅ 正确
match score:
case 'A':
print('A')

错误3:版本不支持

# ⚠️ 注意:match-case 需要 Python 3.10+
# Python 3.9 及以下版本不支持