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() 的函数。它接收一个整数参数,将其与所有可能的工作日数字值匹配,并返回相应的日期名称。


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 语句将 “_” 作为要比较的值。它充当 通配符大小写,如果所有其他大小写都不为 true,则将执行通配符。

Match 语句中的组合大小写

有时,可能会出现对于多个案例必须采取类似操作的情况。为此,您可以将大小写与用 “|” 符号表示的 OR 运算符组合在一起。

下面的代码显示了如何在 match 语句中组合大小写。它定义了一个名为 access() 的函数,并有一个 string 参数,表示用户的名称。对于 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

List 作为 match case 语句中的参数

由于 Python 可以将表达式与任何文本匹配,因此您可以使用 list 作为大小写值。此外,对于列表中可变数量的项目,可以使用 “*” 运算符将它们解析为序列。

在这段代码中,我们使用 list 作为 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 会根据 Literals 大小写匹配表达式。但是,它允许在 case 子句中包含 if 语句,以便对 match 变量进行条件计算。

在下面的示例中,function 参数是 amount 和 duration 的列表,并且要计算小于或大于 10000 的 intereset。条件包含在 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