Python指南之結構化模式匹配:讓編程變得更簡單、更靈活
Python的結構化模式匹配
Python 3.10 版本引入了一項新功能,叫做結構化模式匹配。這其實就是一種條件邏輯,可以讓我們根據不同的條件執行不同的代碼。
比如說,我想根據用戶的午餐訂單來顯示不同的消息:
lunch_order = input("What would you like for lunch? ")
match lunch_order:
case 'pizza':
print("Pizza time!")
case 'sandwich':
print("Here's your sandwich")
case 'taco':
print('Taco, taco, TACO, tacotacotaco!')
case _:
print("Yummy.")
在這里,程序會檢查 lunch_order
的值,并與不同的情況進行匹配。一旦找到匹配項,就會執行相應的代碼。比如用戶輸入 "pizza",程序就會顯示"Pizza time!"。
最后一個情況中的下劃線 _
是一個通配符,可以匹配任何值。如果輸入的值沒有匹配到前面的任何一種,就會執行這個通配符對應的代碼。
或模式
在 Python 的模式匹配中,我們還可以用 or
模式來匹配多個可能的值。比如:
lunch_order = input("What would you like for lunch? ")
match lunch_order:
# --snip--
case 'taco':
print('Taco, taco, TACO, tacotacotaco!')
case 'salad' | 'soup':
print('Eating healthy, eh?')
case _:
print("Yummy.")
在這個例子中,如果用戶輸入 "salad" 或 "soup",程序就會顯示 "Eating healthy, eh?"。
捕獲模式
首先,我們來看看怎么用Python來做一個午餐點餐的程序。我們的目的是,無論用戶輸入什么,我們都能給出一個回應。看這個例子:
lunch_order = input("你想吃什么午餐?")
match lunch_order:
# 這里還有其他代碼
case 'salad' | 'soup':
print('吃得健康哦!')
case order:
print(f"享受你的{order}。")
在這個代碼里,如果用戶輸入的不是我們列出的菜單上的東西,比如不是沙拉或湯,我們就用 case order:
這行來捕獲他們的輸入。這樣用戶輸入什么,我們就回應什么。
部分捕獲
我們還可以只捕獲用戶輸入的一部分。比如說,我們想讓程序能處理類似“草莓冰淇淋”這樣的輸入,我們可以這樣寫:
lunch_order = input("你想吃什么午餐?")
if ' ' in lunch_order:
lunch_order = lunch_order.split(maxsplit=1)
match lunch_order:
case (flavor, 'ice cream'):
print(f"這是你的成熟{flavor}午餐。")
# 這里還有其他代碼
這段代碼會把輸入分成兩部分,如果第二部分是"ice cream",第一部分就會被捕獲為 flavor
。
注意點
使用捕獲模式時,有一個小陷阱。在模式中的所有沒有修飾的變量名,都會被用來捕獲值。這意味著,如果你想使用某個變量的值,你需要使用點操作符來指定它。看這個例子:
class Special:
TODAY = 'lasagna'
lunch_order = input("你想吃什么午餐?")
match lunch_order:
case Special.TODAY:
print("今天的特餐很棒!")
case 'pizza':
print("披薩時間!")
守衛語句
最后,我想向你們展示一個叫做“守衛語句”的技巧。這是一個額外的條件語句,只有在滿足這個條件時,模式才會匹配。比如說,我們想讓程序能特別處理“冰淇淋”這個詞,我們可以這樣寫:
class Special:
TODAY = 'lasagna'
lunch_order = input("你想吃什么午餐?")
match lunch_order:
# 這里還有其他代碼
case 'salad' | 'soup':
print('吃得健康哦!')
case ice_cream if 'ice cream' in ice_cream:
flavor = ice_cream.replace('ice cream', '').strip()
print(f"這是你的成熟{flavor}午餐。")
case order:
print(f"享受你的{order}。")
在這個例子里,如果用戶輸入的詞里包含"ice cream",程序就會特別處理。
希望這個小教程對你們有幫助!通過這些例子,你可以看到Python模式匹配的強大之處,以及它如何幫助我們更好地處理數據和用戶的輸入。
Python模式匹配總結
在Python中,模式匹配有點像“魔法”,很容易讓人愛不釋手。但記住,不要濫用哦!結構化模式匹配特別適合在多種可能的模式中檢查一個主題,但就像午餐訂單中的“冰淇淋”情形,當主題的可能值變得復雜時,它的局限性就顯現出來了。如果你不確定是否需要在某個場景使用結構化模式匹配,那就堅持使用條件語句吧。