乐趣区

关于python:Python重大变化是matchcase不是switchcase

前言
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

@dataclass
class Point:
    x: int
    y: int

def 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 Enum
class Color(Enum):
    RED = 0
    GREEN = 1
    BLUE = 2

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 :(")

10

字面量会被非凡看待,例如 None, False, True,是应用 is 实现匹配的

例如:

match b:
    case True:
        print("Yes!")

就齐全等价于这样

    ...
    if b is True:
        print("Yes!")

最近整顿了几百 G 的 Python 学习材料,蕴含电子书、教程、视频等等,收费分享给大家!想要的返回公~ 豪“Python 编程学习圈”,发送“J”即可收费取得

退出移动版