文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python 中pass和match使用方法

2024-04-02 19:55

关注

前言

​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 语句的其他特性:

case (Point(x1, y1), Point(x2, y2) as p2): ...
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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯