一.介绍
该语句可以实现与if...elif...else语句相似的多分支选择的功能。
但是比if...elif...else语句更强大,可以轻松匹配列表、元组、字典、类以及其他更复杂的结构。
通用语法如下:
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case _ :
<action_wildcard>
解释:
参数说明:
subject:必选参数,用于指定具有特定类型的数据,如数字,字符串,列表,元组等。
<pattern_1>,<pattern_2>:subject参数中的一个值,用于进行模式匹配。
在程序执行中,将从上到下一次进行比较,直到匹配到一个模式后结束匹配
<action_1>,<action_2>:指定要执行的与匹配模式相关联的动作
_和<action_wildcard>:可选参数,用于指定当前面的case语句不能完全匹配时所使用的通配符,该case语句将作为已匹配模式,从而执行 <action_wildcard>所指定的动作。如果不存在该语句,则当前面的case语句不能完全匹配时,该match语句将不执行任何操作
二.代码示例
# match...case 语句
# 匹配字面值
from datetime import datetime
day = datetime.today().weekday()
match day:
case 0:
print("今天,星期一,新的一周开始了!")
case 4:
print("今天,星期五,工作一天周末了!")
case 5|6:
print("今天,是周末!")
case _ :
print("今天,普通的工作日!加油~")
# 绑定变量
a = input("请输入一个需要匹配的数字:")
match a:
case b:
print("变量b被赋值为",b)
# 输入的坐标数据,其中eval()函数用于将传入的字符串作为表达式执行
point = eval(input("请输入坐标:"))
match point:
case (0,0):
print(f"{point}是原点")
case (0,y):
print(f"Y轴坐标为:{y}")
case (x,0):
print(f"X轴坐标为:{x}")
case (x,y):
print(f"X轴坐标为:{x},Y轴坐标为:{y}")
# 使用if语句
x,y = eval(input("请输入一个坐标:"))
if x == 0 and y == 0:
print(f"({x},{y})是原点")
elif x != 0 and y == 0:
print(f"X轴坐标为:{x}")
elif x == 0 and y != 0:
print(f"Y轴坐标为:{y}")
else:
print(f"X轴坐标为:{x},Y轴坐标为:{y}")
# 约束项
"""
在实现case匹配时,可以添加一个if语句来作为该case的约束项。如果if语句判断成功,则将执行该case语句;
相反,若if语句判断失败,那么该case语句将不会被匹配,并继续寻找下一个case匹配项
"""
point = eval(input("请输入坐标:"))
match point:
case (x,y) if x > y:
print(x,y,"x大于y")
case (x,y) if x < y:
print(x,y,"x小于y")
case (x,y):
print(x,y,"x等于y")
# 匹配字典
d = {1:"alan",2:"andy"}
match d:
case {1:"alan"}:
print("匹配成功!")
# 如果想要获取原字典中没有匹配到的键值对的值,可以使用通配符**进行获取
d = {1:"alan",2:"andy",3:"aliy"}
match d:
case {1:"alan",**remainder}:
print("匹配成功!" + '\n' + f"该字典中其他键值对为:{remainder}")
# 如果想要匹配键值对的值,可以使用变量进行匹配
d = {1:"alan",2:"andy",3:"aliy"}
match d:
case {2:a,3:b}:
print(a,b)