网易首页 > 网易号 > 正文 申请入驻

Python:结构模式匹配 match-case

0
分享至

自 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.

相关推荐
热点推荐
被抢男婴成年之后:直面人贩子,出庭为修复内心伤痛 | 红星深度

被抢男婴成年之后:直面人贩子,出庭为修复内心伤痛 | 红星深度

红星新闻
2025-09-19 19:47:24
做痔疮手术带来的无尽之痛:PPH手术并发症患者发声求关注

做痔疮手术带来的无尽之痛:PPH手术并发症患者发声求关注

大风新闻
2025-09-17 19:36:14
重磅!江苏一地发现金矿

重磅!江苏一地发现金矿

鲁中晨报
2025-09-19 11:12:03
马英九:九三阅兵不是没邀请,而是吓得不敢来

马英九:九三阅兵不是没邀请,而是吓得不敢来

雪中风车
2025-09-19 14:42:53
清华晨跑队刘小平去世,年仅51岁,坚持晨跑8年,前一天还在跑步

清华晨跑队刘小平去世,年仅51岁,坚持晨跑8年,前一天还在跑步

千言娱乐记
2025-09-19 19:00:10
山姆回应卖冷冻2年的西兰花

山姆回应卖冷冻2年的西兰花

大象新闻
2025-09-19 20:25:01
突发!特朗普刚宣布:美军发起新一轮打击,多人死亡

突发!特朗普刚宣布:美军发起新一轮打击,多人死亡

大国之翼
2025-09-19 06:35:04
为什么金曲歌后也卖不动票了?

为什么金曲歌后也卖不动票了?

音乐先声
2025-09-19 02:59:15
速递|重磅!字节跳动正式公告:将按中国法律推进TikTok美国相关工作

速递|重磅!字节跳动正式公告:将按中国法律推进TikTok美国相关工作

ZFinance
2025-09-20 01:13:55
女童遭侵犯警方以行政处罚结案,检察机关介入后嫌犯被判刑二年十个月

女童遭侵犯警方以行政处罚结案,检察机关介入后嫌犯被判刑二年十个月

澎湃新闻
2025-09-19 22:28:32
中国八月经济数据全面下滑,结构转型迫在眉睫

中国八月经济数据全面下滑,结构转型迫在眉睫

黑噪音
2025-09-19 11:29:00
叙利亚百姓终于不忍了,接连打出铁拳,首都惊现“祖宅保卫战”

叙利亚百姓终于不忍了,接连打出铁拳,首都惊现“祖宅保卫战”

君笙的拂兮
2025-09-19 02:33:56
非必要不做CT!《新英格兰医学杂志》:每10个儿童血癌就有1个与CT有关;每多做一次CT,都可能增加癌症风险

非必要不做CT!《新英格兰医学杂志》:每10个儿童血癌就有1个与CT有关;每多做一次CT,都可能增加癌症风险

医诺维
2025-09-19 11:55:55
翟欣欣判刑12年,血亲的复仇:她曾经有机会不坐牢,可惜太蠢了!

翟欣欣判刑12年,血亲的复仇:她曾经有机会不坐牢,可惜太蠢了!

人生飞机稿
2025-09-19 11:46:04
突发!央媒官宣降温股市!9月19号,今日凌晨的四大消息全面发酵

突发!央媒官宣降温股市!9月19号,今日凌晨的四大消息全面发酵

搬砖知天下事
2025-09-19 08:40:47
农妇“辱骂”法官,10万罚款撤销了

农妇“辱骂”法官,10万罚款撤销了

中国新闻周刊
2025-09-19 15:57:40
从2-4到5-4,周跃龙逆转卢卡!晋级英格兰赛4强,争冠赛程出炉

从2-4到5-4,周跃龙逆转卢卡!晋级英格兰赛4强,争冠赛程出炉

球场没跑道
2025-09-19 22:55:04
性生活谁才是真正在受益者?

性生活谁才是真正在受益者?

诗意世界
2025-09-19 20:25:01
三镇主场崩盘2-5溃败!近11轮仅1胜 河南4轮不败 阿奇姆彭2射1传

三镇主场崩盘2-5溃败!近11轮仅1胜 河南4轮不败 阿奇姆彭2射1传

我爱英超
2025-09-19 21:42:26
云海肴创始人赵晗去世,仅40岁,门店规模超150家,年营收超10亿

云海肴创始人赵晗去世,仅40岁,门店规模超150家,年营收超10亿

180视角
2025-09-19 14:24:53
2025-09-20 04:36:49
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1526文章数 63关注度
往期回顾 全部

科技要闻

直击iPhone 17开售:消费者偏爱银色橙色

头条要闻

山东入室被抢男婴到15岁没见过汽车 养家从不让他出门

头条要闻

山东入室被抢男婴到15岁没见过汽车 养家从不让他出门

体育要闻

从轮椅到铜牌 他熬了7年:下个目标唱国歌!

娱乐要闻

全智贤被全面抵制!相关代言评论区沦陷

财经要闻

习近平同美国总统特朗普通电话

汽车要闻

对话周光:一个技术理想主义者的“蜕变”

态度原创

健康
教育
时尚
艺术
军事航空

内分泌科专家破解身高八大谣言

教育要闻

TTS新传论文带读:气候传播?南方转向?这俩可以合在一起说嘛?

卡其裤+蓝衬衫,简单高级

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

军事要闻

卫星图像显示以军坦克集结加沙城周围

无障碍浏览 进入关怀版