前言
2021 年 2 月 8 日,领导委员会通过了 PEP 634, PEP635, PEP636,至此,Python 总算领有了 match-case, 不必再写一连串的 if-else 了
1
最简略的模式如下,将 match 主题表达式与一个或多个字面量模式进行比拟
def http_error(status): match status: case 400: return "Bad request" case 401: return "Unauthorized" case 403: return "Forbidden" case 404: return "Not found" case 418: return "I'm a teapot" case _: return "Something else"
最初一个 case 中,case _:相似于 C 和 Java 中的default:,永远不会匹配失败,即当其余 case 都无奈匹配时,匹配这条
2
能够应用|将多个字面量组合起来示意或
... case 401|403|404: return "Not allowed"
3
模式也能够是解包操作,用于绑定变量
# 主题表达式是一个(x, y)元组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")
留神,第一个模式中有两个字面量,能够看作是上述一般模式的加强版。然而后两个模式有些不同,元组中一个是字面量一个是变量,这个变量会捕捉主题元组中的值。同理,第四个模式case (x, y):会捕捉两个值,这在实践上与解包作业类似,就如同point(x, y) = point
4
如果应用了构造数据类,比方data classes,能够用相似于构造函数'类名+参数列表'的模式,然而用来捕捉变量
from dataclasses import dataclass@dataclassclass Point: x: int y: intdef whereis(point): match point: case Point(0, 0): print("Origin") case Point(0, y): print(f"Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("Somewhere else") case _: print("Not a point")
5
也能够应用关键字参数。下列对于y, var的模式都是等价的,并且都将属性绑定到了变量上
Point(1, var)Point(1, y=var)Point(x=1, y=var)Point(y=var, x=1)
6
模式能够被简略粗犷的嵌套起来,例如咱们有一组 points 的列表,就能够像这样匹配
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")
7
给模式增加 if 从句以充当门卫。如果为假,就移步到下一个 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")
8
子模式能够应用as捕捉
case (Point(x1, y1), Point(x2, y2) as p2): ...
9
模式能够应用命名的常量,且必须应用.以避免被解释为捕捉变量
from enum import Enumclass Color(Enum): RED = 0 GREEN = 1 BLUE = 2match color: case Color.RED: print("I see red!") case Color.GREEN: print("Grass is green") case Color.BLUE: print("I'm feeling the blues :(")
10
字面量会被非凡看待,例如None, False, True,是应用is实现匹配的
例如:
match b: case True: print("Yes!")
就齐全等价于这样
... if b is True: print("Yes!")
最近整顿了几百 G 的 Python 学习材料,蕴含电子书、教程、视频等等,收费分享给大家!想要的返回公~豪 “Python 编程学习圈”,发送 “J” 即可收费取得