自 Python 3.10 起,官方引入了结构模式匹配(Structural Pattern Matching)语法,类似于其他语言中的 switch-case、模式解构(如 Rust 的 match、Haskell 的 case)等。该语法提供了一种更自然、更强大、更具结构感的条件分支机制,适用于复杂数据结构的模式匹配、结构化解析、分支逻辑优化等场景。
一、基本语法结构
结构匹配使用 match 和 case 关键字。基本语法结构如下:
match subject:
case pattern1:
# 代码块1
case pattern2:
# 代码块2
...
(1)subject 是要匹配的对象。
(2)每个 case 语句会尝试将 subject 与 pattern 进行匹配。
(3)匹配成功时执行对应的代码块,不会自动“贯穿”下一条 case(与 C/C++ 中 switch 不同)。
二、常见模式类型与用法举例
1、字面量模式
Literal Pattern
用于匹配代码中的,如字符串、数字、布尔值、None 等:
command = "start"
match command:
case "start":
print("✅ 启动")
case "stop":
print("⛔ 停止")
case None:
print("⚠ 没有命令")
case _:
print("⚠ 未知命令")
# 输出:✅ 启动
2、通配符模式
Wildcard Pattern
使用通配符 _ 表示匹配任意值,但不会绑定变量,常用于默认匹配:
code = 503
match code:
case 200:
print("请求成功")
case 404:
print("资源未找到")
case _:
print("其他错误")
# 输出:其他错误
3、or 模式
Or Pattern
用 | 将多个子模式组合为一个,表示“匹配任意一个即可”:
confirm = "y"
match confirm:
case "yes" | "y":
print("确认")
case "no" | "n":
print("取消")
# 输出:确认
适用于多个值共享同一处理逻辑的情况。
4、捕获模式
Capture Pattern
捕获模式用于将匹配到的值绑定为变量,供后续使用。
(1)单值绑定
value = 42
match value:
case x:
print(f"值为:{x}")
# 输出:值为:42
提示:
如果没有其他上下文,变量名会匹配任何值,因此这类 case 通常写在最后或加上条件限制。
(2)序列捕获
可以对列表、元组等序列进行结构性解包:
point = [3, 4]
match point:
case [x, y]:
print(f"二维坐标:({x}, {y})")
# 输出:二维坐标:(3, 4)
也支持使用 * 运算符进行序列解包:
data = [1, 2, 3, 4, 5]
match data:
case [first, *rest]:
print(f"第一个是:{first},剩下的是:{rest}")
# 输出:第一个是:1,剩下的是:[2, 3, 4, 5]
5、门卫模式
Guard Pattern
在 case 后使用 if 添加条件判断,控制匹配逻辑:
number = -10
match number:
case x if x > 0:
print("正数")
case x if x < 0:
print("负数")
case 0:
print("零")
# 输出:负数
注意: x 必须在模式中已经被捕获才能用于 if 条件中。
三、进阶技巧
1、类结构匹配
可以匹配自定义对象的结构属性(前提是该类定义了 __match_args__ 或使用 的 dataclass):
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(10, 20)
match p:
case Point(x, y):
print(f"点的坐标为:({x}, {y})")
# 输出:点的坐标为:(10, 20)
2、字典匹配
可以匹配字典中的键值结构,支持值绑定:
event = {"type": "login", "user": "alice"}
match event:
case {"type": "login", "user": name}:
print(f"{name} 已登录")
# 输出:alice 已登录
也可以用通配符 _ 忽略某些字段:
event = {"type": "login", "user": "alice"}
match event:
case {"type": "login", "user": name}:
print(f"{name} 登录")
case {"type": "logout", "user": name}:
print(f"{name} 登出")
case _:
print("未知事件")
# 输出:alice 登录
3、嵌套结构匹配
支持匹配嵌套结构,如嵌套的字典、列表、对象等:
data = {"user": {"name": "Tom", "age": 18}}
match data:
case {"user": {"name": name, "age": age}}:
print(f"{name},{age}岁")
# 输出:Tom,18岁
4、类型匹配
可用于匹配对象的类型(类构造器):
item = 3.14
match item:
case str():
print("是字符串")
case int():
print("是整数")
case float():
print("是浮点数")
# 输出:是浮点数
四、补充说明
1、match-case 是 3.10+ 新语法,需确保 Python 版本支持。
2、case 中变量名会绑定新值,不能与局部变量名冲突。
3、or 模式和通配符 _ 不能同时与捕获变量组合使用。
4、case 匹配顺序重要,第一个成功匹配会终止匹配过程。
5、典型应用场景
小结
结构模式匹配是一项现代化、结构化的语法特性,为 Python 引入更清晰的数据解构和分支判断机制。它不仅提升了代码可读性,也适用于多种高级编程场景,如网络协议解析、树结构遍历、命令路由、数据清洗等。
“点赞有美意,赞赏是鼓励”
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.