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