Python match语句的具体使用

python 3.10支持match语句,3,10以下不支持。

match语句接受一个表达式,并将其值与作为一个或多个case块给出的连续模式进行比较。这表面上类似于C、Java或JavaScript(以及许多其他语言)中的switch语句,但更类似于Rust或Haskell等语言中的模式匹配。只有第一个匹配的模式才会被执行,它还可以将值中的组件(序列元素或对象属性)提取到变量中。

最简单的形式是将一个目标值与一个或多个字面值进行比较:

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

注意最后一个代码块:“变量名” _ 被作为 通配符 并必定会匹配成功。 如果没有 case 语句匹配成功,则不会执行任何分支。

使用 | (“ or ”)在一个模式中可以组合多个字面值:

case 401 | 403 | 404:
    return "Not allowed"

模式的形式类似解包赋值,并可被用于绑定变量:

# point is an (x, y) tuple
match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print(f"Y={y}")
    case (x, 0):
        print(f"X={x}")
    case (x, y):
        print(f"X={x}, Y={y}")
    case _:
        raise ValueError("Not a point")

请仔细研究此代码! 第一个模式有两个字面值,可以看作是上面所示字面值模式的扩展。但接下来的两个模式结合了一个字面值和一个变量,而变量 绑定 了一个来自目标的值(point)。第四个模式捕获了两个值,这使得它在概念上类似于解包赋值 (x, y) = point。

如果使用类实现数据结构,可在类名后加一个类似于构造器的参数列表,这样做可以把属性放到变量里:

class Point:
    x: int
    y: int

def where_is(point):
    match point:
        case Point(x=0, y=0):
            print("Origin")
        case Point(x=0, y=y):
            print(f"Y={y}")
        case Point(x=x, y=0):
            print(f"X={x}")
        case Point():
            print("Somewhere else")
        case _:
            print("Not a point")

可在 dataclass 等支持属性排序的内置类中使用位置参数。还可在类中设置 __match_args__ 特殊属性为模式的属性定义指定位置。如果它被设为 ("x", "y"),则以下模式均为等价的,并且都把 y 属性绑定到 var 变量:

Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)

读取模式的推荐方式是将它们看做是你会在赋值操作左侧放置的内容的扩展形式,以便理解各个变量将会被设置的值。 只有单独的名称(例如上面的 var)会被 match 语句所赋值。 带点号的名称 (例如 foo.bar)、属性名称(例如上面的 x= 和 y=)或类名称(通过其后的 "(...)" 来识别,例如上面的 Point)都绝不会被赋值。

模式可以任意地嵌套。例如,如果有一个由点组成的短列表,则可使用如下方式进行匹配:

match points:
    case []:
        print("No points")
    case [Point(0, 0)]:
        print("The origin")
    case [Point(x, y)]:
        print(f"Single point {x}, {y}")
    case [Point(0, y1), Point(0, y2)]:
        print(f"Two on the Y axis at {y1}, {y2}")
    case _:
        print("Something else")

为模式添加成为守护项的 if 子句。如果守护项的值为假,则 match 继续匹配下一个 case 语句块。注意,值的捕获发生在守护项被求值之前:

match point:
    case Point(x, y) if x == y:
        print(f"Y=X at {x}")
    case Point(x, y):
        print(f"Not on the diagonal")

match 语句的其他特性:

  • 与解包赋值类似,元组和列表模式具有完全相同的含义,并且实际上能匹配任意序列。 但它们不能匹配迭代器或字符串。
  • 序列模式支持扩展解包操作:[x, y, *rest] 和 (x, y, *rest) 的作用类似于解包赋值。 在 * 之后的名称也可以为 _,因此,(x, y, *_) 可以匹配包含至少两个条目的序列,而不必绑定其余的条目。
  • 映射模式:{"bandwidth": b, "latency": l} 从字典中捕获 "bandwidth" 和 "latency" 的值。与序列模式不同,额外的键会被忽略。**rest 等解包操作也支持。但 **_ 是冗余的,不允许使用。

使用 as 关键字可以捕获子模式:

case (Point(x1, y1), Point(x2, y2) as p2): ...

将把输入的第二个元素捕获为 p2 (只要输入是包含两个点的序列)

大多数字面值是按相等性比较的,但是单例对象 True, False 和 None 则是按标识号比较的。

模式可以使用命名常量。 这些命名常量必须为带点号的名称以防止它们被解读为捕获变量:

from enum import Enum
class Color(Enum):
    RED = 'red'
    GREEN = 'green'
    BLUE = 'blue'

color = Color(input("Enter your choice of 'red', 'blue' or 'green': "))

match color:
    case Color.RED:
        print("I see red!")
    case Color.GREEN:
        print("Grass is green")
    case Color.BLUE:
        print("I'm feeling the blues :(")

到此这篇关于Python match语句的具体使用的文章就介绍到这了,更多相关Python match内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python3.9.1中使用match方法详解

    接触编程的朋友都听过正则表达式,在python中叫re模块,属于文字处理服务里面的一个模块.re里面有一个方法叫match,接下来的文章我来详细讲解一下match. 作为新手,我建议多使用帮助文档,也就是help(re),来获取对re的说明.也可以尝试打开模块对应的py文件,细致地了解实现方法. 当然那是后话,饭得一口一口吃. 本文的主角是match,match的作用主要是从字符串起始位置匹配一个模式,如果成功则返回一个对象,失败则为None. 而match的语法是这样:match(patter

  • python re.match()用法相关示例

    学习python爬虫时遇到了一个问题,书上有示例如下: import re line='Cats are smarter than dogs' matchObj=re.match(r'(.*)are(.*?).*',line) if matchObj: print('matchObj.group():',matchObj.group()) print('matchObj.group(1):', matchObj.group(1)) print('matchObj.group(2):', matc

  • python用match()函数爬数据方法详解

    match()函数的使用.以及从文本中提取数据的方法.在学习re模块的相关函数前应了解正则表达式的特殊字符 准备一个要爬取的文本文档: 直接从某个网页拷贝一份代码,粘贴在 一个txt文件里,以供学习. 方法很简单,比如打开百度视频的热门电影网页,右键点击查看源代码,然后复制,粘贴到一个txt文件里,保存到工作目录下. 有4000多行. re.match(pattern, string, flags=0) ①pattern,是正则表达式.string,被检验的字符串. ②flags是可选参数,此标

  • Python3.10新特性之match语句示例详解

    目录 正文 通过字典间接实现 switch 在case中使用元组 正文 在Python 3.10发布之前,Python是没有类似于其他语言中switch语句的,要实现类似的功能最简单的方法就是通过if ... elif ... else ...语句,但是这样毕竟不够优雅,不够“Pythonic” 更推荐的做法是通过字典(dict)实现. 通过字典间接实现 switch 想要通过字典来实现条件分支语句,首先我们需要定义一个字典,来表示不同case和返回值/函数之间的映射关系,然后再利用字典的特性,

  • python re.match函数的具体使用

    目录 1 re.match 说明 2 span 的使用 3 group 的使用 4 匹配不到内容的情况 5 使用group 注意点 6 flag 的使用 1 re.match 说明 re.match()  从开始位置开始往后查找,返回第一个符合规则的对象,如果开始位置不符合匹配队形则返回None 从源码里面看下match 里面的内容 里面有3个参数 pattern ,string ,flags pattern : 是匹配的规则内容 string : 要匹配的字符串 flag : 标志位(这个是可

  • Python break语句详解

    Python break语句,就像在C语言中,打破了最小封闭for或while循环.break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句.break语句用在while和for循环中.如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码. 一.Python语言 break 语句语法 复制代码 代码如下: break 二.逻辑流程图三.使用实例 复制代码 代码如下: #!/usr/bin/python for lette

  • Python循环语句之break与continue的用法

    Python break 语句 Python break语句,就像在C语言中,打破了最小封闭for或while循环. break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句. break语句用在while和for循环中. 如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码. Python语言 break 语句语法: break 流程图: 实例: #!/usr/bin/python for letter in 'Pyt

  • Python with语句上下文管理器两种实现方法分析

    本文实例讲述了Python with语句上下文管理器.分享给大家供大家参考,具体如下: 在编程中会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作:当语句块执行完成后,需要继续执行一些收尾动作.例如,文件读写后需要关闭,数据库读写完毕需要关闭连接,资源的加锁和解锁等情况. 对于这种情况python提供了上下文管理器(Context Manager)的概念,可以通过上下文管理器来定义/控制代码块执行前的准备动作,以及执行后的收尾动作. 一.为何使用上下文管理器 1.

  • 深入浅析python with语句简介

    with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with 语句相关部分介绍).with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的"清理"操作,释放资源,比如文件使用后自动关闭.线程中锁的自动获取和释放等. 术语 要

  • Python分支语句与循环语句应用实例分析

    本文实例讲述了Python分支语句与循环语句应用.分享给大家供大家参考,具体如下: 一.分支语句 1.if else语句 语法: if 条件判断: 执行的语句块1 else : 执行语句块2 当满足条件的时候则执行语句块1 ,不满足条件就执行语句块2 注意:1.条件判断后面要加冒号":": 2.执行语句块需要缩进[4个空格]. else 与 if对齐,else后面要加":",语句块缩进4个空格 ''' 从控制台输入年龄,如果年龄小于18岁,打印"未成年人禁

  • python标记语句块使用方法总结

    python标记语句块使用方法,python语言和其它的编程语言有着显著的区别,那就是python对格式的要求非常苛刻,好处就是书写上简易命令,写错了就会自动报错,但实际上标记语块非常容易. 这里打开编辑器,新建一个py文件作为示范. def happy(): print("Very Happy!") happy() 创建函数的时候,冒号以后需要进行缩进,标记语句块. x = 1 while x < 5: print(x) x += 1 在用while的时候,冒号以后需要进行缩进

  • Python如何计算语句执行时间

    这篇文章主要介绍了Python如何计算语句执行时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 魔法命令 In [1]: #%time 对单个语句执行时间计时用法放在需要计算的语句前面 %time sum(range(1000)) Wall time: 0 ns Out[1]: 499500 In [2]: #这个操作很快,可以用%timeit计算,该命令重复计算很多次以得到更精确的时间,重复次数自动调整 %timeit sum(range(

  • Python with语句和过程抽取思想

    python中的with语句使用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会执行规定的__exit__("清理")操作,释放被访问的资源,比如有文件读写后自动关闭.线程中锁的自动获取和释放等. 与python中with语句有关的概念有:上下文管理协议.上下文管理器.运行时上下文.上下文表达式.处理资源的代码段. with语句的应用场景   编程中有很多操作都是配套使用的,这种配套的流程可以称为计算过程,Python语言为这种计算过程专门设计了一种结构:with语句

  • Python continue语句实例用法

    Python continue语句: 当执行到 continue 语句时,将不再执行本次循环中 continue 语句接下来的部分,而是继续下一次循环. lst = [7,8,9,4,5,6] for i in range(len(lst)): if lst[i] == 9: continue #当运行到 continue 语句时,不执行本次循环中剩余的代码,而是继续下一层循环 print(lst[i],end = " ") # 7 8 4 5 6 当存在嵌套循环时: lst = [7

  • python with语句的原理与用法详解

    本文实例讲述了python with语句的原理与用法.分享给大家供大家参考,具体如下: 之前看到一篇博客说博主python面试时遇到面试官提问with的原理,而那位博主的博文没有提及with原理,故有此文. 关于with语句,官方文档中是这样描述的: The with statement is used to wrap the execution of a block with methods defined by a context manager (see section With Stat

随机推荐