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`
匹配模式 模式匹配 值匹配
相关推荐
jerryinwuhan41 分钟前
《Python数据预处理》第四章
开发语言·python
雨晨源码(同名B站)1 小时前
基于Python的网易云音乐评论数据情感化分析系统 音乐爬虫信息可视化 |SnowNLP评论情感分析
开发语言·hadoop·爬虫·python·信息可视化·毕业设计
阿童木写作1 小时前
跨境电商图片翻译工具推荐:跨马翻译批量处理视频字幕与抠图
python·音视频
怪奇云呼军2 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
ZC跨境爬虫2 小时前
LeetCode 27. 移除元素(双指针详解 + Java Python 多解法对比)
java·python·leetcode
Patrick在香港2 小时前
Python正则表达式实战:解析和验证香港身份证、车牌、电话格式
开发语言·python·正则表达式
路溪非溪2 小时前
Python语言的执行流程总结
开发语言·python
宋均浩3 小时前
AI 生成代码质量防线实战:5 个 CI/CD 配置,把 8% 的逻辑错拦在线上之前0
python
树码小子3 小时前
Pycharm解释器配置问题解决
ide·python·pycharm
国雪3 小时前
python-协程
python