python3.10 新增的 match case 语句

python 3.10 新增的 math case 语句

python 3.10 中新加了一个匹配语句,类似于其他如Java中的 switch... case... ,它可以方便的匹配你想要的内容。可以作为一部分 if...elif...else 的替代品,并且减少代码量。

下面是一个使用 match...case...if...elif...else 的对比,两者做的事情相同。

# if else
names = ['zhao', 'qian', 'sun', 'slsls']
for name in names:
    if name == 'zhao':
        print('赵')
    elif name == 'qian':
        print('钱')
    elif name == 'sun':
        print('孙')
    else:
        print('未知姓氏')

# match case
for name in names:
    match name:  # match 后面跟要匹配的对象
        case 'zhao':  # 一旦某个 case 匹配上了,不会继续执行下面的其他 case
            print('赵')
        case 'qian':
            print('钱')
        case 'sun':
            print('孙')
        case _:  # _ 捕获其他未涵盖的情况
            print('未知姓氏')

简单教程:

官方教程链接

1. 匹配序列

a = [1, 2, 3]
match a:
    case [1]:
        print("匹配 [1]")
    case [1, obj]:
        print("匹配长度为2的列表,且列表的第一个元素是1,第二个元素不限,并用 obj 作为第二个元素的别名,若能匹配上,可以通过obj变量获取第二个元素内容", obj)
    case [1, *obj]:
        print("匹配长度大于等于1的列表,且列表第一个元素是1,后面可以有多个元素,也可以没有任何元素", obj)
    case [1, (2|3), 3]:
        print("| 代表 or;(2|3)代表列表的第二个元素要么是2,要么是3")
    case [1, (2|3) as second, 3]:
        print("和上一个一样,只不过给第二个元素绑定了一个别名:second,如果匹配上,可以通过 second 变量获取第二个元素", second)
    case [1, 2] | [1, 2, 3]:
        print('匹配 [1,2] or [1,2,3]')
    case [1, second, 3] if second == 2:
        print('带有限制条件的匹配,后面的 if 条件满足了,才会进行匹配')
    case _:
        print('_ 代表匹配其他情况,类似于 if...else.. 语句中的 else')

2. 匹配对象

class A(object):
    def __init__(self, x, y=None):
        self.x = x
        self.y = y
a = A(1, 1)
b = A(2, 2)
c = A(3)  # 使用了默认参数
obj = [a, b, c]
for i in obj:
    match i:
        case A(x=1, y=1):  # 此处不能直接写实例化的对象,要写 类名(参数,..)
            print('匹配实例化类时,参数x=1, y=1 的对象')
        case A(x=3):
            print('匹配实例化类时,参数x=3,y使用了默认值的对象')
        case A(x=first, y=second):
            print("匹配参数为任意值的实例化对象,first,second两个变量,可以方便的获取对象 x,y 属性实际存储的值",first, second)

3. 匹配字典

a = {'name': 'wang', "age": 22}
b = {'name': b'zhang', 'age': "33"}
c = {'name': b'zhao', 'age': 23}
ls = [a, b, c]
for i in ls:
    match i:
        case {"name": name, 'age': int(age)}:  # int(age) 代表匹配 age 字段是整数类型的值,name 字段没有规定,所以任意类型都会匹配
            print(f"匹配 age 是整数类型的:{name},{age}")
        case {"name": name, "age": str(age)}:
            print(f'匹配 age 是字符串类型的:{name},{age}')

posted @ 2021-11-04 09:31  wztshine  阅读(2883)  评论(0编辑  收藏  举报