乐趣区

关于python:刚刚Python-310-正式发布了我发现了一个可怕的功能

就在前几天 (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 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 若有运行到,对应的变量是会被创立的。比方

5. 应用可变参数 **kv

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

6. 长度的匹配形式

若你心愿应用 case 仅对对象的长度做一些匹配,能够应用上面这样的形式

  • [*_] 匹配任意长度的 list;
  • (_, _, *_) 匹配长度至多为 2 的 tuple

7. 类对象的匹配

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

8. 匹配要留神程序

在上边根本介绍完了 match-case 的应用办法,如需更具体的内容,不如去通读下 pep 636 的内容。

在文章最开始的时候,我说过开发者应该对这些新个性 心存敬畏 ,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 的匹配规定 后,再去应用它。

另外,这个性能一出,有许多人示意 终于来了 ,也有一些人示意 太鸡肋了

我对于此事的认识是,match-case 必然有肯定的实用场景,但这不意味着 match-case 是必要的,所有的 match-case 都能够换成 if 表达式,但反过来却不然,if 能够联合 and 和 or 承接 n 个多简单的组合判断,但 match-case 却不行,它只能用于单个对象进行匹配判断。

然而从肯定水平上来说,它有点多余,而且有肯定的上手老本。

那么对于这样的一个 新个性,你会用它吗?


文章最初给大家介绍三个我本人写的在线文档:

第一个文档:PyCharm 中文指南 1.0 文档

花了两个多月的工夫,整顿了 100 个 PyCharm 的应用技巧,为了让老手可能间接上手,我花了很多的工夫录制了上百张 GIF 动图,有趣味的返回在线文档浏览。

第二个文档:PyCharm 黑魔法指南 1.0 文档

零碎收录各种 Python 冷门常识,Python Shell 的多样玩法,令人疯狂的 Python 炫技操作,Python 的超具体进阶常识解读,十分实用的 Python 开发技巧等。

第三个文档:Python 中文指南 1.0 文档

花了三个月工夫写的一本 适宜零根底入门 Python 的全中文教程,搭配大量的代码案例,让初学者对 代码的运作成果有一个直观感触,教程既有深度又有广度,每篇文章都会标内容的难度,是根底还是进阶的,可供读者进行抉择,是一本难得的 Python 中文电子教程。

退出移动版