python 中pass和match使用方法
作者:D八哥卷 发布时间:2023-07-17 05:49:47
前言
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 :(")
来源:https://blog.51cto.com/u_15477882/5565467


猜你喜欢
- JDBC,Java Database Connectivity,即 Java 数据库连接。实际上 JDBC 是 Java 中的一套和数据库进
- 这个问题让我查了许多天才解决,为了避免后面的人重复走弯路,记录下来。问题描述:我在ubuntu 下编译安装了caffe ,在命令行模式下可以
- 表格制作好了,内容也有了,怎么看着别扭呀!哦,还没有给表格化化装--格式化表格呀,俗话说:人靠衣服也靠鞍,要想让你制作的网页漂漂亮亮、美观大
- 需求描述数据库中 num字段值为:实现的效果:需要将一行数据变成多行实现的sqlSELECT SUBSTRING_INDEX(SUBSTRI
- 图像处理工具——灰度直方图灰度直方图时图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。例子:矩阵图片来自网络,侵删!上
- 默认情况下,TensorFlow 会映射进程可见的所有 GPU 的几乎所有 GPU 内存(取决于 CUDA_VISIBLE_DEVICES)
- 代码如下:--Begin Index(索引) 分析优化的相关 Sql -- 返回当前数据库所有碎片率大于25%的索引 -- 运行
- 在软件项目实施的时候,数据导入一直是项目人员比较头疼的问题。其实,在SQL Server中集成了很多成批导入数据的方法。有些项目实施顾问头疼
- Static(静态)关键字用来定义静态方法和属性,static 也可用于定义静态变量以及后期静态绑定。1、静态变量 static varia
- 为什么选择Python进行数据分析?Python是一门动态的、面向对象的脚本语言,同时也是一门简约,通俗易懂的编程语言。Python入门简单
- 这是由十几位视觉设计师设计的挂历,每个月份都是不同的风格,就像每个月都有不同温度和心情一样,思维跳跃性很大,可以作为挂历设计参考。当然,如果
- 可以通过浏览器在访问者的硬盘上创建文件,因为我开始试了一下真的可以,不信你把下面这段代码COPY到一个HTML文件当中再运行一下! <
- 用df命令查了下,果然磁盘满了,因为当时分区采用系统默认,不知道为什么不能自动扩容!以后在处理这个问题!如图所示:[root@snsgou
- Accessibility—-可访问性/无障碍访问Accessibility在此处指网页的可访问性。W3C的网页可访问性定义如下:“网页可访
- 以下是我这几天一直在用的几个命令,先记下来,以后会整理一份mysql详细的使用文档注:[]中代表名字,需要用库名或者表名替换显示所有的库:s
- 当然这点小问题是难不倒我们程序员的,“max+1啊”,有人会说这样的方式。是的,这种方式实现起来也比较简单。当然你也许还会说,最Sql的方式
- http 模块简介Python3 中的 http 包中含有几个用来开发 HTTP 协议的模块。http.client 是一个底层的 HTTP
- 序Python易用,但用好却不易,其中比较头疼的就是包管理和Python不同版本的问题,特别是当你使用Windows的时候。为了解决这些问题
- 1、需要的环境Python2.XRequests 库2、单字段发送单个文件在requests中发送文件的接口只有一种,那就是使用reques
- 步骤:1、新建一个空文件,文件名为hhhh2、初始化git init3、自己要与origin master建立连接(下划线为远程仓库链接)g