Python match-case
语句接受一个表达式,并将其值与以一个或多个 case
块形式给出的连续模式进行比较。只有第一个匹配的模式会被执行。此外,还可以从值中的组件(如序列元素或对象属性)中提取变量。
随着 Python 3.10 的发布,引入了一种称为 match-case
的模式匹配技术,它类似于 C/C++/Java 中的 switch-case
结构。它的基本用途是将变量与一个或多个值进行比较。它与 Rust 或 Haskell 等语言中的模式匹配更为相似,而不是 C 或 C++ 中的 switch
语句。
match-case
语句的语法
以下是 Python 中 match-case
语句的语法:
match 变量名:
case '模式 1': 语句 1
case '模式 2': 语句 2
...
case '模式 n': 语句 n
示例
以下代码有一个名为 weekday()
的函数。它接收一个整数参数,将其与所有可能的星期几数字值进行匹配,并返回相应的星期几名称。
def weekday(n):
match n:
case 0: return "星期一"
case 1: return "星期二"
case 2: return "星期三"
case 3: return "星期四"
case 4: return "星期五"
case 5: return "星期六"
case 6: return "星期日"
case _: return "无效的日期编号"
print(weekday(3))
print(weekday(6))
print(weekday(7))
执行时,此代码将产生以下输出:
星期四
星期日
无效的日期编号
函数中最后一个 case
语句以 _
作为要比较的值。它充当通配符,当所有其他 case
都不成立时,它将被执行。
match
语句中的组合案例
有时,可能会出现需要对多个案例采取类似操作的情况。为此,您可以使用 |
符号表示的 OR
运算符将案例组合在一起。
示例
以下代码展示了如何在 match
语句中组合案例。它定义了一个名为 access()
的函数,并有一个字符串参数,表示用户的名称。对于管理员或经理用户,系统授予完全访问权限;对于访客,访问权限受到限制;对于其他用户,则没有访问权限。
def access(user):
match user:
case "admin" | "manager": return "完全访问"
case "Guest": return "有限访问"
case _: return "没有访问权限"
print(access("manager"))
print(access("Guest"))
print(access("Ravi"))
运行上述代码后,将显示以下结果:
完全访问
有限访问
没有访问权限
将列表作为 match-case
语句中的参数
由于 Python 可以将表达式与任何文字进行匹配,因此您可以使用列表作为案例值。此外,对于列表中可变数量的项目,可以使用 *
运算符将它们解析为序列。
示例
在此代码中,我们在 match-case
语句中使用列表作为参数。
def greeting(details):
match details:
case [time, name]:
return f'早上好 {time} {name}!'
case [time, *names]:
msg = ''
for name in names:
msg += f'早上好 {time} {name}!\n'
return msg
print(greeting(["早晨", "Ravi"]))
print(greeting(["下午", "Guest"]))
print(greeting(["晚上", "Kajal", "Praveen", "Lata"]))
执行时,此代码将产生以下输出:
早上好 早晨 Ravi!
早上好 下午 Guest!
早上好 晚上 Kajal!
早上好 晚上 Praveen!
早上好 晚上 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("利息 =", intr([5000, 5]))
print("利息 =", intr([15000, 3]))
执行时,此代码将产生以下输出:
利息 = 2500.0
利息 = 6750.0