Python 中的 match-case(模式匹配)

match-case 是 Python 3.10 引入的一种结构化的模式匹配 语法,功能类似于其他语言中的 switch-case,但远比它强大和灵活 。它不仅仅是值的匹配,而是基于结构的匹配。

一、基本语法:值的匹配

最简单的用法就是匹配一个变量的值。

复制代码
def http_status(code):
    match code:
        case 200:
            return "OK"
        case 404:
            return "Not Found"
        case 500:
            return "Internal Server Error"
        case _:
            return "Unknown Status"

print(http_status(404))  # Not Found

这里的 _ 是通配符,匹配所有未被前面 case 捕获的情况(类似于其他语言的 default)。

二、匹配字面量、变量和类型

1. 匹配多个值(使用 | 表示或)

复制代码
def get_weekday(num):
    match num:
        case 1 | 7:
            return "周末"
        case 2 | 3 | 4 | 5 | 6:
            return "工作日"
        case _:
            return "无效数字"

2. 匹配变量,并捕获值

可以用 case 中的变量来"捕获"匹配到的值,供后续使用。注意:变量名必须是大写 (如 CODE),否则会和通配符混淆(但实际规则更细一些)。

复制代码
def handle_code(code):
    match code:
        case 200:
            print("成功")
        case CODE:   # 这里匹配任意值,并赋值给 CODE
            print(f"未知状态码: {CODE}")

3. 匹配类型(使用 case 配合 isinstance 的语法糖)

注意:这里不是直接写类名,而是使用"类模式",写法类似构造函数。

复制代码
def process_value(value):
    match value:
        case int():
            print("这是一个整数")
        case str():
            print("这是一个字符串")
        case list():
            print("这是一个列表")
        case _:
            print("其他类型")

三、解构模式

这是 match-case 真正强大的地方:可以解构数据,匹配内部结构并提取数据。

1. 匹配序列(列表/元组)

复制代码
def process_point(point):
    match point:
        case [0, 0]:
            print("原点")
        case [x, 0]:
            print(f"在 X 轴上,x={x}")
        case [0, y]:
            print(f"在 Y 轴上,y={y}")
        case [x, y]:
            print(f"普通点,x={x}, y={y}")
        case _:
            print("不是二维点")

process_point([0, 5])   # 在 Y 轴上,y=5

2. 匹配字典

复制代码
def handle_json(data):
    match data:
        case {"type": "user", "name": name, "age": age}:
            print(f"用户: {name}, 年龄: {age}")
        case {"type": "product", "name": name, "price": price}:
            print(f"产品: {name}, 价格: {price}")
        case _:
            print("未知数据结构")

3. 匹配对象(类实例)

复制代码
class Point:
    __match_args__ = ("x", "y")
    def __init__(self, x, y):
        self.x = x
        self.y = y

def process_point(p):
    match p:
        case Point(x=0, y=0):
            print("原点")
        case Point(x=x, y=0):
            print(f"在X轴上, x={x}")
        case Point(x=0, y=y):
            print(f"在Y轴上, y={y}")
        case Point(x=x, y=y):
            print(f"普通点, x={x}, y={y}")

四、与 switch-case 的区别

match-case 和传统的 switch-case 看起来像,但本质不同:

特性 match-case 传统 switch-case
支持解构
匹配类型 支持 不支持
通配符 _ default
多值匹配 `case 1 2`
匹配模式 模式匹配 值匹配
相关推荐
小柯南敲键盘13 小时前
跨马翻译:图片翻译软件批量处理,跨境电商视频字幕AI智能抠图
人工智能·python·音视频
BYSJMG13 小时前
计算机毕业设计选题推荐|【基于大数据的植被光谱特征与环境因子关联分析及可视化】Spark+K-Means
大数据·python·信息可视化·数据分析·spark·kmeans·课程设计
茶栀(*´I`*)13 小时前
Python网络机器人入门:从Robots协议、网页结构到Requests库的基础实践
网络·python·机器人
SunnyDays101113 小时前
如何使用 Python 添加和编辑 Excel VBA 宏(无需安装 Excel)
开发语言·python·excel·vba
2601_9622959913 小时前
Python+Appium 自动化测试:从基础语法到 PO 模式设计,构建稳定测试框架
自动化测试·python·appium·测试框架·po模式
开源量化GO13 小时前
先确认策略想法能不能变成规则
人工智能·python
拜托多多指教13 小时前
【Pytest框架学习】分层架构
python·pytest
zhanghaha131413 小时前
Python进阶教程:24_Markdown 转 HTML 零基础超详细教程
开发语言·python·html
2601_9622998813 小时前
python脚本如何单元测试
python·单元测试·pytest·unittest·mock对象
女神下凡14 小时前
PyCharm 2026破解激活
ide·python·pycharm