python 中pass和match使用方法

前言

​pass​​ 语句不执行任何操作。语法上需要一个语句,但程序不实际执行任何动作时,可以使用该语句。

例如:

>>> while True:
... pass # Busy-wait for keyboard interrupt (Ctrl+C)
...

下面这段代码创建了一个最小的类:

>>> class MyEmptyClass:
... pass
...

​pass​​​ 还可以用作函数或条件子句的占位符,让开发者聚焦更抽象的层次。此时,程序直接忽略 ​​pass​​:>>>

>>> def initlog(*args):
... pass # Remember to implement this!
...

match​​ 语句

A ​​match​​ statement takes an expression and compares its value to successive patterns given as one or more case blocks. This is superficially similar to a switch statement in C, Java or JavaScript (and many other languages), but it can also extract components (sequence elements or object attributes) from the value into variables.

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

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, *_)​​可以匹配包含至少两个条目的序列,而不必绑定其余的条目。
  • Mapping patterns:​​{"bandwidth": b, "latency": l}​​​captures the​​"bandwidth"​​​and​​"latency"​​​values from a dictionary. Unlike sequence patterns, extra keys are ignored. An unpacking like​​**rest​​​is also supported. (But​​**_​​would be redundant, so it is not allowed.)
  • 使用​​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 中pass和match使用方法的文章就介绍到这了,更多相关python pass和match内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python pass函数实例用法

    说到占位符,大家从字面意思上可以看出,是占一个位置.因为在实际操作中,我们有很多代码是不能立刻填上的,所以会用pass函数来解决.下面我们就pass函数进行说明.语法的介绍,并带来实例. 1.说明 可以用pass语句来占位,也可以当做是一个标记,是要过后来完成的代码. 2.语法 pass 3.实例 i = 3 if i <3: print("测试1") else: i += 1 pass print("测试2",i) #pass无论是前后都会执行相应的代码,单

  • 深入理解最新Python中的Match Case

    有些人仍然认为 Python 不需要"switch-case"语法. 甚至 Guido 本人也不支持在 Python 中添加这种语法.但是,为什么它仍然在这个新版本中发布? 在我看来,原因可以从名称中找到,它被称为"match case"而不是像大多数编程语言那样的"switch case". 在本文中,我将使用 7 个示例来演示新语法的灵活性和"pythonic",希望它能帮助你更容易理解它.如果你对 Python 3.10

  • 运用Python3实现Two-Pass算法检测区域连通性

    目录 技术背景 Two-Pass算法 测试数据的生成 Two-Pass算法的实现 算法的执行流程 标签的重映射 其他的测试用例 总结概要 参考链接 技术背景 连通性检测是图论中常常遇到的一个问题,我们可以用五子棋的思路来理解这个问题五子棋中,横.竖.斜相邻的两个棋子,被认为是相连接的,而一样的道理,在一个二维的图中,只要在横.竖.斜三个方向中的一个存在相邻的情况,就可以认为图上相连通的.比如以下案例中的python数组,3号元素和5号元素就是相连接的,5号元素和6号元素也是相连接的,因此这三个元

  • python getpass模块用法及实例详解

    getpass import getpass username = input("username:") password = getpass.getpass("password:") print(username,password) 在pycharm中运行下面的代码时不能输入密码(软件问题,代码没错),选择命令行执行 密码默认不显示 例子: import getpass _usename = "fww" _password = "12

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

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

  • Python OpenCV中的drawMatches()关键匹配绘制方法

    目录 作用说明 函数原型 参数详解 结果 作用说明 该方法被用于绘制关键点的匹配情况.我们看到的许多匹配结果都是使用这一方法绘制的——一左一右两张图像,匹配的关键点之间用线条链接. 函数原型 cv.drawMatches( img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchColor[, singlePointColor[, matchesMask[, flags]]]]) -> outImg cv.drawMatche

  • python正则表达式函数match()和search()的区别

    match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配, 也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none 例如: #! /usr/bin/env python # -*- coding=utf-8 -*- import re text= 'pythontab' m= re.match(r"\w+", text) if m: print m.group(0) el

  • python中break、continue 、exit() 、pass终止循环的区别详解

    python中break.continue .exit() .pass区分 1.break:跳出循环,不再执行 Python break语句,就像在C语言中,打破了最小封闭for或while循环. break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句. break语句用在while和for循环中. 如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码. 例1: break跳出while死循环 ```python wh

  • Python中pass的作用与使用教程

    Python中pass的作用 空语句 do nothing 保证格式完整 保证语义完整 以if语句为例,在c或c++/java中: if(true) ; //do nothing else { //do something } 对应于python就要这样写: if true: pass #do nothing else: #do something ###1 pass语句在函数中的作用 当你在编写一个程序时,执行语句部分思路还没有完成,这时你可以用pass语句来占位,也可以当做是一个标记,是要过

  • python 中pass和match使用方法

    前言 ​​pass​​ 语句不执行任何操作.语法上需要一个语句,但程序不实际执行任何动作时,可以使用该语句. 例如: >>> while True: ... pass # Busy-wait for keyboard interrupt (Ctrl+C) ... 下面这段代码创建了一个最小的类: >>> class MyEmptyClass: ... pass ... ​​pass​​​ 还可以用作函数或条件子句的占位符,让开发者聚焦更抽象的层次.此时,程序直接忽略 ​

  • 在Python中COM口的调用方法

    如下所示: import serial import time t = serial.Serial('com6', 115200) #USB COM number on your PC and the transfer bit rate of the COM port. print t.portstr #Display the working UART port number on your PC. n = t.write('logcat -c \r') n = t.write('ampclie

  • python中退出多层循环的方法

    1.定义标记变量:利用变量值的变化退出循环 # 第一种嵌套形式 a = [[1, 2, 3], [5, 5, 6], [7, 8, 9]] # init_i = 0 # init_j = 0 flag = True for i in range(3): for j in range(3): # print(i, j) if a[i][j] == 5: flag = False init_i = i init_j = j break if not flag: break print(init_i,

  • python中常见错误及解决方法

    python常见的错误有 1.NameError变量名错误 2.IndentationError代码缩进错误 3.AttributeError对象属性错误 详细讲解 1.NameError变量名错误 报错: >>> print a<br>Traceback (most recent call last):<br>File "<stdin>", line 1, in <module><br>NameError:

  • Python中关于面向对象私有属性方法的详细讲解

    目录 1.私有属性和私有方法 私有属性: 私有方法: 类部调用私有属性和私有方法 子类不能继承父类私有属性和方法 实例属性(对象属性) 通过实例(对象)去修改类属性 2.修改私有属性的值 3.类属性和实例属性 4.类方法和静态方法 类方法: 静态方法: 实例方法 5.__new__方法 6.单例模式 福利 1.私有属性和私有方法 封装的意义: 将属性和方法放到一起做为一个整体,然后通过实例化对象来处理: 隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了: 对类的属性和方法增加 访问权限控

  • 详解Python中Addict模块的使用方法

    目录 介绍 1.安装 2.用法 3.要牢记的事情 4.属性,如键.item等 5.默认值 6.转化为普通字典 7.计数 8.更新 9.Addict 是怎么来的 介绍 Addit 是一个Python模块,除了提供标准的字典语法外,Addit 生成的字典的值既可以使用属性来获取,也可以使用属性进行设置. 这意味着你不用再写这样的字典了: body = {     'query': {         'filtered': {             'query': {              

  • python中elasticsearch_dsl模块的使用方法

    目录 前言 连接elasticsearch elasticsearch_dsl.Search query方法 filter方法 index方法 elasticsearch_dsl.query elasticsearch_dsl.Q 嵌套类型 查询 排序 分页 聚合 高亮显示 source限制返回字段 删除 案例分析 前言 elasticsearch-dsl是基于elasticsearch-py封装实现的,提供了更简便的操作elasticsearch的方法. 安装: install elastic

  • python中requests使用代理proxies方法介绍

    学习网络爬虫难免遇到使用代理的情况,下面介绍一下如何使用requests设置代理: 如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求: import requests proxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080", } requests.get("http://examp

  • Python中optionParser模块的使用方法实例教程

    本文以实例形式较为详尽的讲述了Python中optionParser模块的使用方法,对于深入学习Python有很好的借鉴价值.分享给大家供大家参考之用.具体分析如下: 一般来说,Python中有两个内建的模块用于处理命令行参数: 一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的.符合Unix/Posix 规范的命令行说明. 示例如下: from optparse impo

  • python中requests模块的使用方法

    本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合性的功能.相比于urllib2,Kenneth Reitz的Requests模块更能简约的支持完整的简单用例. 简单的例子: 想象下我们试图使用get方法从http://example.test/获取资源并且查看返回代码,content-type头信息,还有response的主体内容.这件事无论使用

随机推荐