核心概念
当程序需要针对一个变量的多种可能值进行判断时,传统的 if ... elif ... elif ... else
结构会变得冗长且可读性较差。python 3.10 引入了 match
语句(也称为模式匹配),它提供了一种更简洁、更直观的方式来处理多分支条件判断。
1. 基本match语句
- 功能:将一个目标(如变量)与一系列模式(
case
)进行比较,并执行第一个匹配成功的分支。 - 与传统if对比:
- if 写法 (冗长):
score = 'b' 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 写法 (清晰):
score = 'b' match score: case 'a': print('score is a.') case 'b': print('score is b.') case 'c': print('score is c.') case _: # `_` 是通配符,匹配任何值 print('invalid score.')
- if 写法 (冗长):
- 关键点: -
case _:
必须放在最后,用于捕获所有未被前面 case 匹配的情况,类似于else
。- 语法结构更加规整,意图更明确。
2. 复杂匹配模式
match
的强大之处在于其灵活的匹配模式,远不止简单的相等判断。
- 带守卫条件的匹配:使用
if
在case
内进行额外条件检查。 - 多值匹配:使用
|
(或)来匹配多个值。 - 值绑定:在匹配的同时,将匹配到的值捕获到变量中。
示例:
age = 15 match age: case x if x < 10: # 匹配所有小于10的值,并将其绑定到变量x 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 19: print('19 years old.') case _: print('not sure.')
3. 高级应用:匹配列表(解包匹配)
match
语句可以匹配复杂的数据结构,如列表,并能进行解包操作,这使其功能非常强大。
示例:解析命令行参数
args = ['gcc', 'hello.c', 'world.c'] # 模拟用户输入的命令 match args: # 模式1: 列表只包含一个元素'gcc' case ['gcc']: print('gcc: missing source file(s).') # 模式2: 列表第一个元素是'gcc',第二个是任意值(绑定到file1),后面是0个或多个值(绑定到files) case ['gcc', file1, *files]: print(f'gcc compile: {file1}, {", ".join(files)}') # 模式3: 列表只包含一个元素'clean' case ['clean']: print('clean') # 默认情况 case _: print('invalid command.')
*files
:这是一个通配符,它可以捕获列表中的零个或多个剩余元素。这使得匹配可变长度的列表变得非常简单。- 工作原理:
match
会按顺序尝试匹配每个case
的模式。例如,对于['gcc', 'hello.c', 'world.c']
,它会匹配第二个模式,并赋值file1 = 'hello.c'
和files = ['world.c']
。
总结要点
- 为什么使用
match
:替代冗长的if-elif-else
链,极大地提高代码的可读性和简洁性,尤其是在处理多个枚举值或复杂数据结构时。 - 基本语法:使用
match target:
和一系列case pattern:
进行匹配。 - 强大功能:
- 精确匹配:
case 'a':
- 或匹配:
case 11 | 12 | 13:
- 守卫条件:
case x if x < 10:
- 通配符:
case _:
(匹配任何值) - 解包匹配:
case ['cmd', arg1, *args]:
(匹配并提取列表内容)
- 精确匹配:
- 适用场景:处理状态码、命令解析、处理json或嵌套数据等任何需要多分支判断的场景。
match
语句是python现代化的重要特性,掌握它可以让你的代码更加优雅和pythonic。
将之前的练习题 重新写一写
hight = 1.50 weight = 50.5 bmi = weight / hight ** 2 print("bmi=", bmi) match bmi: case _ if bmi < 18.5: print("过轻") case _ if 18.5 <= bmi < 25: print("正常") case _ if 25 <= bmi < 28: print("过重") case _ if 28 <= bmi < 32: print('肥胖') case _: print("严重肥胖")
到此这篇关于python模式匹配match case的实现的文章就介绍到这了,更多相关python模式匹配match case内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论