Python Match Case语句
在Python 3.10版本之前,Python缺乏类似于C或C++的switch-case功能。在Python 3.10中引入了一种称为match-case的模式匹配技术,它类似于”switch case”结构。
一个 match 语句接受一个表达式,并将其值与连续的模式(作为一个或多个case块给出)进行比较。使用方法更类似于Rust或Haskell等语言的模式匹配,而不是C或C++中的switch语句。只有第一个匹配的模式将被执行。还可以从该值中提取组件(序列元素或对象属性)到变量中。
语法
match-case的基本用法是将变量与一个或多个值进行比较。
match variable_name:
case 'pattern 1' : statement 1
case 'pattern 2' : statement 2
...
case 'pattern n' : statement n
示例
以下代码具有一个名为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语句的比较值为“_”。它作为通配符的情况,如果所有其他情况都不成立,则会执行。
组合情况
有时,可能会出现一种情况,需要对多个情况采取相似的操作。为此,可以使用“|”符号表示的OR运算符来组合情况。
示例
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"))
输出
以上代码定义了一个名为access()的函数,并有一个字符串参数,表示用户的名称。对于管理员或经理用户,系统授予完全访问权限;对于访客,访问权限受限;对于其他用户,没有访问权限。
Full access
Limited access
No access
列表作为参数
由于Python可以将表达式与任何字面量进行匹配,因此您可以将列表作为一个情况值。此外,对于列表中的变量数量的项,它们可以使用”*”运算符解析为序列。
示例
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子句中包含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