前言
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语句
Amatch
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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 1亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 2现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 3如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 4AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 5转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 6充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 7好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 8名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?
- 9亚马逊云科技成立量子网络中心致力解决量子计算领域的挑战
- 10京东绿色建材线上平台上线 新增用户70%来自下沉市场