Python - match-case 語句



Python match-case 語句

Python 的match-case語句接收一個表示式,並將其值與後續給出的一個或多個 case 塊中的模式進行比較。只有第一個匹配的模式才會被執行。也可以將值中的元件(序列元素或物件屬性)提取到變數中。

從 Python 3.10 版本開始,引入了一種稱為match-case的模式匹配技術,類似於 C/C++/Java 等語言中可用的switch-case結構。其基本用途是將變數與一個或多個值進行比較。它更類似於 Rust 或 Haskell 等語言中的模式匹配,而不是 C 或 C++ 中的 switch 語句。

語法

以下是 Python 中 match-case 語句的語法:

match variable_name:
   case 'pattern 1' : statement 1
   case 'pattern 2' : statement 2
   ...
   case 'pattern n' : statement n

示例

以下程式碼包含一個名為 weekday() 的函式。它接收一個整數引數,將其與所有可能的 weekday 數字值匹配,並返回相應的日期名稱。

def weekday(n):
   match n:
      case 0: return "Monday"
      case 1: return "Tuesday"
      case 2: return "Wednesday"
      case 3: return "Thursday"
      case 4: return "Friday"
      case 5: return "Saturday"
      case 6: return "Sunday"
      case _: return "Invalid day number"
print (weekday(3))
print (weekday(6))
print (weekday(7))

執行後,這段程式碼將產生以下輸出:

Thursday
Sunday
Invalid day number

函式中的最後一個 case 語句使用 "_" 作為要比較的值。它充當萬用字元 case,如果所有其他 case 都為假,則將執行它。

match 語句中的組合 case

有時,可能存在多種情況需要採取類似操作的情況。為此,可以使用由 "|" 符號表示的 OR 運算子組合 case。

示例

以下程式碼展示瞭如何在 match 語句中組合 case。它定義了一個名為 access() 的函式,並帶有一個字串引數,表示使用者名稱。對於 admin 或 manager 使用者,系統授予完全訪問許可權;對於 Guest,訪問許可權有限;對於其餘使用者,則無訪問許可權。

def access(user):
   match user:
      case "admin" | "manager": return "Full access"
      case "Guest": return "Limited access"
      case _: return "No access"
print (access("manager"))
print (access("Guest"))
print (access("Ravi"))

執行上述程式碼後,將顯示以下結果:

Full access
Limited access
No access

match case 語句中以列表作為引數

由於Python可以將表示式與任何字面量匹配,因此您可以使用列表作為case值。此外,對於列表中數量可變的專案,可以使用"*"運算子將其解析為序列。

示例

在此程式碼中,我們使用列表作為match case語句的引數。

def greeting(details):
   match details:
      case [time, name]:
         return f'Good {time} {name}!'
      case [time, *names]:
         msg=''
         for name in names:
            msg+=f'Good {time} {name}!\n'
         return msg

print (greeting(["Morning", "Ravi"]))
print (greeting(["Afternoon","Guest"]))
print (greeting(["Evening", "Kajal", "Praveen", "Lata"]))

執行後,這段程式碼將產生以下輸出:

Good Morning Ravi!
Good Afternoon Guest!
Good Evening Kajal!
Good Evening Praveen!
Good Evening Lata!

在“Case”子句中使用“if”

通常,Python會將表示式與字面量case匹配。但是,它允許您在case子句中包含if語句,用於對匹配變數進行條件計算。

示例

在下面的示例中,函式引數是金額和期限的列表,而利息的計算要根據金額是否大於或小於10000來進行。條件包含在case子句中。

def intr(details):
   match details:
      case [amt, duration] if amt<10000:
         return amt*10*duration/100
      case [amt, duration] if amt>=10000:
         return amt*15*duration/100
print ("Interest = ", intr([5000,5]))
print ("Interest = ", intr([15000,3]))

執行後,這段程式碼將產生以下輸出:

Interest = 2500.0
Interest = 6750.0
廣告