模式匹配
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-case | if-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 及以下版本不支持