Python 中的 match 語法詳解:新手指南

更新日期: 2024 年 9 月 25 日

在 Python 3.10 中,引入了強大的 match 語法,也稱為 結構模式匹配(Structural Pattern Matching)

這是一種全新的控制流程語句,允許你根據值的結構來執行不同的代碼塊。

對於剛開始學習 Python 的新手來說,理解並掌握 match 語法,將大大提升你處理複雜邏輯的能力。

本文將詳細介紹 Python 中的 match 語法,包括其基本用法、模式匹配技巧和實際應用,並提供豐富的示例,幫助你在實際開發中靈活運用。


match 語法的基本概念

什麼是 match 語法?

match 語法類似於其他編程語言中的 switch 語句,但功能更為強大。

它允許你對一個值進行模式匹配,根據匹配結果執行對應的代碼塊。

為什麼使用 match?

  • 簡潔性:使得多重條件判斷更加清晰和易讀。
  • 可擴展性:支持複雜的結構和類型匹配。
  • 功能強大:可對序列、字典、類等進行解構和匹配。

match 語法的基本結構

基本語法

match value:
    case pattern1:
        # 執行語句1
    case pattern2:
        # 執行語句2
    case _:
        # 預設情況
  • match value:要進行匹配的值。
  • case pattern:匹配的模式。
  • _通配符,匹配任何值,相當於預設情況。

示例

command = "start"

match command:
    case "start":
        print("啟動程序")
    case "stop":
        print("停止程序")
    case _:
        print("未知命令")

輸出:

啟動程序

簡單的模式匹配

字面值匹配

匹配具體的值,例如字串、數字等。

value = 42

match value:
    case 1:
        print("值為 1")
    case 42:
        print("答案是 42")
    case _:
        print("未知的值")

輸出:

答案是 42

多個模式匹配

可以在同一個 case 中匹配多個模式。

color = "red"

match color:
    case "red" | "green" | "blue":
        print("這是一個基本色")
    case _:
        print("其他顏色")

輸出:

這是一個基本色

結構模式匹配

序列解構

可以對列表、元組等序列類型進行解構匹配。

point = (0, 0)

match point:
    case (0, 0):
        print("原點")
    case (0, y):
        print(f"在 Y 軸上,座標為 (0, {y})")
    case (x, 0):
        print(f"在 X 軸上,座標為 ({x}, 0)")
    case (x, y):
        print(f"在平面上,座標為 ({x}, {y})")

輸出:

原點

列表模式

匹配列表的結構和內容。

numbers = [1, 2, 3]

match numbers:
    case [1, 2, 3]:
        print("匹配完整列表")
    case [1, 2, _]:
        print("前三個元素匹配")
    case [1, *rest]:
        print(f"列表以 1 開頭,其餘為 {rest}")
    case _:
        print("不匹配")

輸出:

匹配完整列表

高級模式匹配技巧

使用守衛(Guard)

在模式後添加 if 條件,進一步限制匹配。

age = 25

match age:
    case age if age < 18:
        print("未成年")
    case age if age >= 18 and age < 65:
        print("成年人")
    case _:
        print("老年人")

輸出:

成年人

匹配字典

使用 ** 解構字典。

user = {"name": "Alice", "age": 30}

match user:
    case {"name": name, "age": age}:
        print(f"姓名:{name},年齡:{age}")
    case _:
        print("無法匹配")

輸出:

姓名:Alice,年齡:30

匹配類型

使用類型作為模式,可以匹配特定類型的對象。

value = 3.14

match value:
    case int():
        print("這是一個整數")
    case float():
        print("這是一個浮點數")
    case str():
        print("這是一個字串")
    case _:
        print("未知類型")

輸出:

這是一個浮點數

實際應用示例

計算器

def calculator(a, b, operation):
    match operation:
        case "add":
            return a + b
        case "subtract":
            return a - b
        case "multiply":
            return a * b
        case "divide" if b != 0:
            return a / b
        case "divide":
            return "除數不能為零"
        case _:
            return "未知操作"

result = calculator(10, 5, "divide")
print(f"結果是:{result}")

輸出:

結果是:2.0

解析 JSON 數據

data = {"type": "message", "content": "Hello, World!"}

match data:
    case {"type": "message", "content": content}:
        print(f"收到訊息:{content}")
    case {"type": "error", "code": code}:
        print(f"錯誤代碼:{code}")
    case _:
        print("未知數據類型")

輸出:

收到訊息:Hello, World!

注意事項

Python 版本要求

  • match 語法僅在 Python 3.10 及以上版本可用。
  • 確保你的 Python 版本符合要求,否則會引發語法錯誤。

通配符 _ 的使用

  • _ 是一個特殊的模式,表示匹配任何值。
  • 注意:如果你需要捕獲值,請使用變數名,而非 _

模式的順序

  • 匹配是按順序進行的,一旦匹配成功,後續的 case 將被忽略。
  • 建議:將更具體的模式放在前面,通用的模式放在後面。

不支持可變對象的模式匹配

  • match 語法中的模式應該是不可變的
  • 示例:列表是可變的,但可以使用 [] 來匹配列表結構。

常見錯誤與解決方案

SyntaxError: invalid syntax

問題:

  • 使用了 match 語法,但 Python 版本低於 3.10。

解決方案:

  • 升級 Python 至 3.10 或以上版本。

模式未被匹配

問題:

  • case 中的模式寫錯,導致未匹配到正確的值。

解決方案:

  • 檢查模式是否正確,確保與要匹配的值結構一致。

結論

match 語法為 Python 帶來了強大的模式匹配功能,讓程式的控制流程更加簡潔和清晰。

透過掌握 match 語法,你可以更有效地處理複雜的數據結構和邏輯。

建議新手多加練習,嘗試在實際項目中應用 match,加深理解。


延伸閱讀

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *