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
广告