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

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.

相关推荐
热点推荐
金融、电力、烟草、石油,多地对“近亲繁殖”出手了

金融、电力、烟草、石油,多地对“近亲繁殖”出手了

中国新闻周刊
2026-01-27 14:23:19
具俊晔设计的大S雕像完工,白色S型非常漂亮,纪念大S去世一周年

具俊晔设计的大S雕像完工,白色S型非常漂亮,纪念大S去世一周年

阿纂看事
2026-01-28 11:40:11
要打就打痛!中国手段已升级,日本:中方不批准驻重庆总领事任命

要打就打痛!中国手段已升级,日本:中方不批准驻重庆总领事任命

通文知史
2026-01-28 14:30:03
乌克兰捐款平台收到大量来自中国的捐款

乌克兰捐款平台收到大量来自中国的捐款

老马拉车莫少装
2026-01-28 21:18:45
姆巴佩怒批全队:完全没想拼 活该无缘直通16强 被门将进球很丢人

姆巴佩怒批全队:完全没想拼 活该无缘直通16强 被门将进球很丢人

我爱英超
2026-01-29 08:20:37
瞒不住了!比基辅还惨,乌克兰第二大城市全黑了,朝鲜远火立功了

瞒不住了!比基辅还惨,乌克兰第二大城市全黑了,朝鲜远火立功了

书纪文谭
2026-01-28 13:34:27
一周13人伤亡!建议中国游客春节避免前往俄罗斯旅游

一周13人伤亡!建议中国游客春节避免前往俄罗斯旅游

基本常识
2026-01-28 22:17:24
女子把充电枪扔地上碾压后续:车牌曝光已社死,恶心事不止一件

女子把充电枪扔地上碾压后续:车牌曝光已社死,恶心事不止一件

奇思妙想草叶君
2026-01-28 23:43:15
出卖信任的刀,最终刺向了谁?汇丰银行为孟晚舟事件付出惊人代价

出卖信任的刀,最终刺向了谁?汇丰银行为孟晚舟事件付出惊人代价

来科点谱
2026-01-29 08:56:35
詹姆斯哭了!骑士视频致敬41岁超巨:双方真有第三次合作可能?

詹姆斯哭了!骑士视频致敬41岁超巨:双方真有第三次合作可能?

罗说NBA
2026-01-29 08:58:39
“人怕正月死,更怕正月生”菩萨:正月出生的人都有这3种大来历

“人怕正月死,更怕正月生”菩萨:正月出生的人都有这3种大来历

古怪奇谈录
2026-01-28 10:12:19
纪实:女儿多次被虐待浑身淤青,父亲冲进教室,怒砍校霸13刀致死

纪实:女儿多次被虐待浑身淤青,父亲冲进教室,怒砍校霸13刀致死

谈史论天地
2026-01-28 17:20:03
出卖信任的刀,最终刺向了谁?汇丰银行为孟晚舟事件付出惊人代价

出卖信任的刀,最终刺向了谁?汇丰银行为孟晚舟事件付出惊人代价

顾史
2026-01-28 20:39:56
黄金概念股突然跳水

黄金概念股突然跳水

第一财经资讯
2026-01-29 10:03:54
库里复出27分总分超皮尔斯!勇士8人上双三杀爵士 穆迪26分

库里复出27分总分超皮尔斯!勇士8人上双三杀爵士 穆迪26分

醉卧浮生
2026-01-29 12:24:09
被扣5分+罚40万!国安官微硬刚足协:人在做天在看,球迷支持上诉

被扣5分+罚40万!国安官微硬刚足协:人在做天在看,球迷支持上诉

我爱英超
2026-01-29 14:04:36
金晨肇事逃逸风波升级!面临行政拘留处罚,多部待播剧恐受影响

金晨肇事逃逸风波升级!面临行政拘留处罚,多部待播剧恐受影响

萌神木木
2026-01-29 12:49:23
读博7年仅发表1篇论文?湖大博士崩溃痛哭,3天就跟导师闹掰了

读博7年仅发表1篇论文?湖大博士崩溃痛哭,3天就跟导师闹掰了

妍妍教育日记
2026-01-28 19:28:30
什么?泽连斯基求见普京?

什么?泽连斯基求见普京?

新民周刊
2026-01-29 09:08:55
中方发布的这个数字,让美国媒体惊呼!

中方发布的这个数字,让美国媒体惊呼!

环球时报国际
2026-01-29 00:15:23
2026-01-29 15:04:49
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1727文章数 72关注度
往期回顾 全部

科技要闻

周亚辉的AI新赌局:国内太卷 出海另起炉灶

头条要闻

外媒:特朗普执政一年后 对华不友好国家正"转向"中国

头条要闻

外媒:特朗普执政一年后 对华不友好国家正"转向"中国

体育要闻

詹姆斯哭了!骑士视频致敬41岁超巨

娱乐要闻

张译不再隐瞒!公开回应退圈息影真相

财经要闻

金价狂飙,历史首次!

汽车要闻

车长超5米还带后轮转向 比亚迪海豹08/海狮08将亮相

态度原创

房产
时尚
数码
教育
军事航空

房产要闻

创历史新高!三亚楼市,太强了!

冬天大衣怎么穿才更好看?选好颜色、找对单品,高级简约又大气

数码要闻

三星AR眼镜官宣2026年内发布,主打多模态AI体验

教育要闻

@2027研考生部分招生单位调整研考初试科目

军事要闻

中国代表:支持伊朗国家稳定 武力解决不了问题

无障碍浏览 进入关怀版