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

Python 3.10 版本 match-case 尝鲜体验!

0
分享至

剧照 | 《兰心大剧院》

就在国庆期间( 2021年10月4日),Python 终于正式发布了 3.10 版本,看了下这个版本的一些特性,最受关注的应该就是结构模式匹配了吧?也就是大家所熟悉的switch-case,写错了不好意思,是 match-case。

下边是最简单的一个 match-case 的例子,看起来是不是非常的直观简洁?

def http_error(status):
match status:
case 400:
print("Bad request")
case 404:
print("Not found")
case 418:
print("I'm a teapot")
case _:
print("Something's wrong with the internet")

对这个功能满怀期待的我,赶紧就下载升级了 3.10 的 Python 赶紧试用,可没想到在我深入的体验过后,我从最开始的期待,变成了敬畏。

敬畏,是因为这样一个看似简单的新功能,却有着不少的学习成本,并且对 结构模式匹配 半知半解的人来说,会增大代码出错的概率,并不是大数人都能轻松驾驭的。

我为什么会这么说呢?我会在文章最后来简述我的观点。

鉴于大多数人,都没有实际用过这种结构模式匹配,我会从 升级 3.10 开始教大家如何尝鲜这个新功能,然后我会详细的介绍 match-case 的使用方法。

1. 升级 3.10 新版本

我本机的电脑上目前的 Python 版本是 3.9.1 的

$ /usr/local/bin/python3 --version
Python 3.9.1

由于这边我使用的是 mac,因此我从官网上下载的是 Python 3.10 的 pkg 文件,如果是 win 的用户,可以下载相应的 msi 或者 exe 文件。

下载链接我贴在下边,可以直接访问下载

mac: https://www.python.org/ftp/python/3.10.0/python-3.10.0-macos11.pkg
win: https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe

我下载好安装文件后,双击安装,之后就双击下载的 pkg 文件,进入安装流程

一路点击继续,该同意的同意一下,出现如下提示表示安装成功。

再次在终端上确认下是否升级成功

在上面我已经贴出一个 match-case 的最简单示例,这边就直接跳过简单示例,来说说那些比较特殊的用法。

在 Python 3.10 中其实有新增一个 联合类型操作符|,但这个只能用于类型,具体的用法,我会在下一篇文章中做详细的介绍,本篇文章还是集中于 match-case 的使用。

在学习match-case 的时候,你会发现,也有一个类似于联合类型操作符的用法,但请你要注意区别,它并不是联合类型操作,而是在 match-case 下独有的or模式操作符|,它可以将多个具体相同逻辑的 case 语句简写成同一个

match status:
case 401 | 403 | 404:
print("Not allowed")
case _:
print("Something's wrong with the internet")
3. 通配符匹配任意对象

match-case 的出现有利于提高代码的可读性,让你的代码更加优雅,但同时要使用好它,也是有一些门槛的,特别是通配符的使用。

下边我举一些例子来进行讲解

在如下代码中,使用了通配符_和 可变参数中的*符号

import sys

match sys.argv[1:]:
case ["quit"]:
print("exit")
case ["create", user]: # 创建单个用户
print("create", user)
case ["create", *users]: # 批量创建多个用户
for user in users:
print("create", user)
case _:
print("Sorry, I couldn't understand the argv")

最后一个 case 中的_并不作为变量名,而表示一种特殊的模式,在前面的 case 中都未命中的情况下,该 case 会是最后的保障,能确保命中,它相当于 Go 语言中的default分支。

import "fmt"

func main() {
education := "本科"

switch education {
case "博士":
fmt.Println("我是博士")
case "研究生":
fmt.Println("我是研究生")
case "本科":
fmt.Println("我是本科生")
case "大专":
fmt.Println("我是大专生")
default:
fmt.Println("学历未达标..")
}
}
4. 使用可变参数 *args

第二个 case 和 第三个 case 非常的像,区别在于第三个 case中users前加了个*,他跟原 Python 函数中的可变参数是一个用法,会匹配列表的多个值。

在该中表示可以从命令行参数中批量创建用户。

在 match-case 中相应的 case 若有运行到,对应的变量是会被创建的。比如

在如下代码中,**rest会匹配到所有的 args 中的 key 和 value

若你希望使用 case 仅对对象的长度做一些匹配,可以使用下面这样的方式

  • [*_]匹配任意长度的list;

  • (, , *_)匹配长度至少为 2 的tuple

7. 类对象的匹配

对于类对象的匹配,下边这个例子足够简单,不再讲解。

在上边基本介绍完了 match-case 的使用方法,如需更详细的内容,不如去通读下 PEP 636(https://www.python.org/dev/peps/pep-0636/) 的内容。

在文章最开始的时候,我说过开发者应该对这些新特性心存敬畏,match-case 这样一个看似简单的新功能,却有着不少的学习成本,如果对结构模式匹配半知半解的人来说,可能会增大代码出错的概率,并不是大数人都能轻松驾驭的。

之所以会这么说,是因为 match-case 在面对不同的对象,它的匹配的规则也有所不同。

  • 当 match 的对象是一个 list 或者 tuple 的时候,需要长度和元素值都能匹配,才能命中,这就是为什么下面这个例子走的是第三个 case 而不是第二个 case。

  • 当 match 的对象是一个 dict 的时候,规则却有所不同,只要 case 表达式中的 key 在所 match 的对象中有存在,即可命中。

  • 而当 match 的对象是类对象时,匹配的规则是,跟 dict 有点类似,只要对象类型和对象的属性有满足 case 的条件,就能命中。

因此在写 match-case 的时候,最大的难点可能就是如何把握这个顺序,才能确保你写的代码不会翻车。

我个人总结一些规律,仅供大家参考:

  • list 或者 tuple:应该从不格式到严格

  • dict 或者 object:应该从严格到不严格

在经过半天时间的尝鲜后,我有了一些自己的理解,分享给大家,不知道我的理解有没有问题,但我依然建议大家在充分了解 match-case 的匹配规则后,再去使用它。

还不过瘾?试试它们

如果你觉得本文有帮助

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

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.

相关推荐
热点推荐
确认了!尼克斯球员出战亚运会!单节24分打懵中国男篮

确认了!尼克斯球员出战亚运会!单节24分打懵中国男篮

篮球实战宝典
2026-05-30 19:53:01
“都把儿子养雌化了!”初中男孩出现雌化现象,家长却执迷不悟

“都把儿子养雌化了!”初中男孩出现雌化现象,家长却执迷不悟

妍妍教育日记
2026-05-29 07:55:13
涉嫌严重违纪违法,王益华被查

涉嫌严重违纪违法,王益华被查

都市快报橙柿互动
2026-05-30 20:11:53
马斯克的用人哲学:一个员工有没有潜力,开会就能看出来,越是平庸的人,越会在这两个细节上暴露自己的“打工者思维”

马斯克的用人哲学:一个员工有没有潜力,开会就能看出来,越是平庸的人,越会在这两个细节上暴露自己的“打工者思维”

心理观察局
2026-05-25 07:20:34
安东尼·戈登正式亮相诺坎普

安东尼·戈登正式亮相诺坎普

温柔且自由
2026-05-31 01:47:10
董宇辉一场直播卖爆6万口锅!锅厂老板惊呼:我信了,这次真服了

董宇辉一场直播卖爆6万口锅!锅厂老板惊呼:我信了,这次真服了

火山詩话
2026-05-30 07:02:32
一个家最好的风水,从来不是优秀的孩子,而是被善待的妈妈

一个家最好的风水,从来不是优秀的孩子,而是被善待的妈妈

青苹果sht
2026-05-30 05:15:46
2026年结束前,除了房子贬值外,我国还将迎来这5大“贬值潮”!

2026年结束前,除了房子贬值外,我国还将迎来这5大“贬值潮”!

职场资深秘书
2026-05-11 19:05:34
新华社消息|商务部:中欧双方正探讨建立贸易投资磋商机制

新华社消息|商务部:中欧双方正探讨建立贸易投资磋商机制

新华社
2026-05-30 21:22:59
一路走好!离6月仅剩1天,5位名人接连去世,最小42岁,令人唏嘘

一路走好!离6月仅剩1天,5位名人接连去世,最小42岁,令人唏嘘

八斗小先生
2026-05-30 13:58:35
普京:亚美尼亚若入欧盟 得先算算经济账

普京:亚美尼亚若入欧盟 得先算算经济账

新华社
2026-05-30 06:32:05
比亚迪的4nm芯片,是自己造的,还是找谁代工的?

比亚迪的4nm芯片,是自己造的,还是找谁代工的?

互联网.乱侃秀
2026-05-30 15:17:53
女主播在果园直播卖货,因太热开空调而露馅,背景全是假的

女主播在果园直播卖货,因太热开空调而露馅,背景全是假的

新游戏大妹子
2026-05-30 13:37:23
陈文茜公开评价说马英九对台湾对国民党的危害,十倍百倍于李登辉

陈文茜公开评价说马英九对台湾对国民党的危害,十倍百倍于李登辉

安安说
2026-05-30 12:25:49
4-2横扫张本智和!19岁国乒天才连斩5大世界名将,一战封神

4-2横扫张本智和!19岁国乒天才连斩5大世界名将,一战封神

小琴动漫
2026-05-30 14:30:26
被中国军队赶跑后,荷兰军舰溜到越南,获越方款待,要再穿行南海

被中国军队赶跑后,荷兰军舰溜到越南,获越方款待,要再穿行南海

影孖看世界
2026-05-30 22:32:27
历史不会重演,但会惊人相似:新能源车,可能会重走燃油车的老路

历史不会重演,但会惊人相似:新能源车,可能会重走燃油车的老路

娱乐圈的笔娱君
2026-05-30 14:50:07
不打了!顶薪后卫退出抢七!雷霆1换4交易方案曝光

不打了!顶薪后卫退出抢七!雷霆1换4交易方案曝光

篮球实战宝典
2026-05-30 15:21:51
赴泰国失联的4名男子已从缅甸转移到曼谷,警方还意外解救一名40岁云南男子:家属称其不会用电脑园区不要他,让给3万元路费,最后翻墙逃跑

赴泰国失联的4名男子已从缅甸转移到曼谷,警方还意外解救一名40岁云南男子:家属称其不会用电脑园区不要他,让给3万元路费,最后翻墙逃跑

每日经济新闻
2026-05-30 15:09:11
“人再笨还学不会微积分吗”,钱学森之子辟谣:父亲从未说过

“人再笨还学不会微积分吗”,钱学森之子辟谣:父亲从未说过

澎湃新闻
2026-05-30 15:50:13
2026-05-31 02:00:49
Python猫 incentive-icons
Python猫
人生苦短,我用Python。博客:https://pythoncat.top
729文章数 8120关注度
往期回顾 全部

科技要闻

车圈大佬发声:价格战远去,但竞争仍残酷

头条要闻

两名9岁女孩被困电梯近2小时 求救几十次物业无动于衷

头条要闻

两名9岁女孩被困电梯近2小时 求救几十次物业无动于衷

体育要闻

岁月不饶人!39岁德约鏖战近5小时拼到呕吐

娱乐要闻

张碧晨《歌手》 “活人微死” 自嘲

财经要闻

双汇管不住一头猪

汽车要闻

900V+3.2秒破百 领克10+&领克10上市16.99万元起

态度原创

时尚
数码
房产
手机
公开课

美回巅峰的她们,带火的这些爆款真的好用吗

数码要闻

没等到Arc G3!华硕ROG Ally 2026新掌机曝光: 仍用AMD锐龙Z2 Extreme

房产要闻

红动五月!全国抢入核心资产,广州盯紧凯旋新世界!

手机要闻

REDMI K90至尊版入网?K90单品激活破200万

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版