阅读本文大概需要 8 分钟。

就在前几天( 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 文件,进入安装流程

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

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

2. or 模式的使用

在上面我已经贴出一个 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 sysmatch 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 若有运行到,对应的变量是会被创建的。比如

5. 使用可变参数 **kv

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

6. 长度的匹配方式

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

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

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

7. 类对象的匹配

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

8. 匹配要注意顺序

在上边基本介绍完了 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 的匹配规则 后,再去使用它。

E N D

各位伙伴们好,詹帅本帅假期搭建了一个个人博客和小程序,汇集各种干货和资源,也方便大家阅读,感兴趣的小伙伴请移步小程序体验一下哦!(欢迎提建议)

推荐阅读

牛逼!Python常用数据类型的基本操作(长文系列第①篇)

牛逼!Python的判断、循环和各种表达式(长文系列第②篇)

牛逼!Python函数和文件操作(长文系列第③篇)

牛逼!Python错误、异常和模块(长文系列第④篇)

刚刚,Python 3.10 正式发布了!我发现了一个可怕的功能...相关推荐

  1. 刚刚,Python 3.10 正式发布了,我发现了一个可怕的功能..

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

  2. 【Python】刚刚,Python 3.10 正式发布了!我发现了一个可怕的功能...

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

  3. 【Python】刚刚,Python3.10 正式发布了!终于增加了这个功能...

    通过官网看到,Python 3.10 刚刚正式发布了! 我说两个新增的很香的功能,一个关于语法,另一个关于标注库里的函数. 1 match和case 语法 熟悉 C++ 的程序员对于switch和ca ...

  4. Python 3.10 正式发布,新增模式匹配,同事用了直呼真香

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 前言 前几天,也就是 10 月 4 日,Python 发布了 3.10.0 版本,什么?3.9 ...

  5. 您应该知道Python 3.10中的新特性!

    Hello,大家好,我是Alex,欢迎来到每周博客! 这篇博客来给大家介绍一下Python 3.10的新特性. Python 3.10版本带来了一些很棒的新功能和改进. 结构模式匹配 结构模式匹配可以 ...

  6. Python 3.10来了!!!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨机器之心 编辑丨极市平台 导读 不用再自己琢磨如何实现 swi ...

  7. 2019学习Python的10个原因

    如果你经常关注我,那你可能想知道为什么我要写一篇文章来告诉你们学习Python?但是几年前我曾向你们说过Java比Python更具有优势,哦,这就尴尬了,但确实,这几年情况有所改变,在2016年,Py ...

  8. python考试有什么用_Python有什么用?2020年学习Python的10个理由

    如果你想学习 Python,但是不知道为什么要学习,那么这里有 10 个理由,强调了在 2020 年学习 Python 的好处. 不过,这些问题取决于谁在问,也就是说,对于初学者来说,学习Python ...

  9. Python 3.10来了,switch语法终于出现

    开发者(KaiFaX) 面向全栈工程师的开发者专注于前端.Java/Python/Go/PHP的技术社区 来源:机器之心 正文 不用再自己琢磨如何实现 switch 功能了. 对于从事数据科学和人工智 ...

最新文章

  1. 用WinForm/WPF代码来为.NET Core 3.0功能投票
  2. java初学者必看——J2SE小结
  3. 【新产品发布】【iHMI43 智能液晶模块 2013 版】
  4. android简单分享----文字加图片
  5. android编译全过程
  6. 未来社会是什么样子的?您猜对了吗?
  7. OpenKruise v0.9.0 版本发布:新增 Pod 重启、删除防护等重磅功能
  8. 7z apache解析漏洞_解析漏洞(Web漏洞及防御)
  9. 26.Silverlight多线程技术ThreadPool的使用
  10. 训练日志 2019.2.14
  11. 51aspx技术文章汇总搜集
  12. 搭建属于自己的影视网站
  13. 学习phyton的基础知识
  14. django创建app的命令
  15. UVALive 4487 - Exclusive-OR -并查集 虚根
  16. 工业互联网产业链全景图深度分析
  17. 概率函数P(x)、概率分布函数F(x)与概率密度函数f(x)的区别
  18. 正本清源:为什么区块链是一次新的信息化革命
  19. 蓝桥杯2017省赛——外星日历(Java)
  20. vue页面导出pdf文档并上传pdf格式给后台

热门文章

  1. 用matlab仿真pwm整流器的方法,MATLAB-PWM整流仿真模块建立详解.pdf
  2. go语言连接redis(已测试)
  3. html 手动添加thead,HTML表格 - 我可以在thead之前添加额外的tbody吗?
  4. c++ protected_合理使用protected关键字,确保类属性的安全性
  5. tos win10打开ip_win 10 系统 Docker 的安装和使用
  6. xampp mysql登录失败_XAMPP修改mysql的root密码phpmyadmin无法登陆
  7. java telnet乱码_telnet乱码的解决方法
  8. 笔记本老出现计算机,电脑老是自动重启,教您如何有效解决这个问题
  9. 初中数学四十二个几何模型_【初中数学】一题贯穿初中几何
  10. caj转pdf_CAJ转PDF文件,这恐怕是最全的方法总结了!