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}')