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

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.

相关推荐
热点推荐
霍启刚高调秀恩爱,搂妻子庆祝女排获胜,郭晶晶42岁反而更漂亮了

霍启刚高调秀恩爱,搂妻子庆祝女排获胜,郭晶晶42岁反而更漂亮了

娱絮
2024-06-16 04:07:51
太阳报:马奎尔在土耳其享受假期,豪华酒店每晚高达6400英镑

太阳报:马奎尔在土耳其享受假期,豪华酒店每晚高达6400英镑

懂球帝
2024-06-15 02:09:10
广州一高校河涌边坡出现塌方

广州一高校河涌边坡出现塌方

鲁中晨报
2024-06-16 17:39:04
经济形势有多严峻?3个现象席卷中国各地,预示苦日子已开始?

经济形势有多严峻?3个现象席卷中国各地,预示苦日子已开始?

山丘楼评
2024-06-07 11:45:11
中共河南省委原副书记王维群

中共河南省委原副书记王维群

坠入二次元的海洋
2024-06-16 17:17:55
笑不活了!女子开水洗拖鞋瞬间缩水,网上求助后用蒸锅“拯救”

笑不活了!女子开水洗拖鞋瞬间缩水,网上求助后用蒸锅“拯救”

看晓天下事
2024-06-15 10:19:20
溥仪出狱后和杜聿明参观故宫,售票员:买票才能进,他如何回答的

溥仪出狱后和杜聿明参观故宫,售票员:买票才能进,他如何回答的

青青河边
2024-06-14 19:55:07
刘奔祝福姜萍,喊话决赛见,称题目很难无处可抄,网友:十三爷

刘奔祝福姜萍,喊话决赛见,称题目很难无处可抄,网友:十三爷

东东趣谈
2024-06-16 09:55:34
1981年,他被连队关禁闭借故爬上大树解闷,一亮光改变了他的人生

1981年,他被连队关禁闭借故爬上大树解闷,一亮光改变了他的人生

百年历史老号
2024-06-12 07:38:26
为何中国患癌率较高?2样东西日本人基本不碰,国人却比较喜欢

为何中国患癌率较高?2样东西日本人基本不碰,国人却比较喜欢

今日养生之道
2024-06-14 07:30:58
反转,C罗强势发言引热议!葡萄牙多人唱衰,球迷:不给球王面子

反转,C罗强势发言引热议!葡萄牙多人唱衰,球迷:不给球王面子

阿泰希特
2024-06-16 12:02:53
“晾衣架”退出中国家庭!建议学习上海人的做法,美观还不占地

“晾衣架”退出中国家庭!建议学习上海人的做法,美观还不占地

阿离家居
2024-06-16 03:38:28
以色列三大港口都遭到火力封锁,相当于已经被按住命脉!

以色列三大港口都遭到火力封锁,相当于已经被按住命脉!

笔墨V
2024-06-16 03:31:34
记者:纳乔已选择加盟吉达联合,体检已完成

记者:纳乔已选择加盟吉达联合,体检已完成

懂球帝
2024-06-15 15:38:09
欧洲杯“含华量”有多高?这些中国巨头火了!

欧洲杯“含华量”有多高?这些中国巨头火了!

中国基金报
2024-06-16 19:28:07
任重庆市纪委副书记两年多后,他履新职

任重庆市纪委副书记两年多后,他履新职

鲁中晨报
2024-06-15 09:11:08
泰山币崩盘!

泰山币崩盘!

邮票暗记
2024-06-12 22:24:24
或将改变世界!中俄两大惊天合作曝光,急得美国直跳脚!

或将改变世界!中俄两大惊天合作曝光,急得美国直跳脚!

华人星光
2024-06-15 16:20:27
心术不正6:错误估计了加代,老乔派兄弟抢钱

心术不正6:错误估计了加代,老乔派兄弟抢钱

金昔说故事
2024-06-16 18:36:02
10年前,两位“夺刀少年”因救人错过高考,拒绝保送后如今怎样了

10年前,两位“夺刀少年”因救人错过高考,拒绝保送后如今怎样了

文史达观
2024-06-09 06:45:02
2024-06-16 19:58:44
Python猫
Python猫
人生苦短,我用Python。博客:https://pythoncat.top
633文章数 8097关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

凯特王妃患癌后首次露面 小王子跳舞抢镜被姐姐制止

头条要闻

凯特王妃患癌后首次露面 小王子跳舞抢镜被姐姐制止

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

健康
数码
游戏
时尚
公开课

晚餐不吃or吃七分饱,哪种更减肥?

数码要闻

高通骁龙独享!Intel、AMD新笔记本首发不支持Copilot+

SIE为《浪人崛起》提供支持 通关数十次来反馈意见

建议中年男人:包包尽量别背“LV、Gucci”,换成另外3种更有格调

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版