python之match-case
类似于switch的语法,可以避免if else大量嵌套的情况,python3.10以上版本引入了match-case 同时match case还是一个非常强大的匹配语法
match case的基础语法是
mathc <表达式>:
case <值1>:
<代码1>
case <值2>:
<代码2>
case <值3>|<值4>|<值5>:
<代码3>
case _:
<代码5>
表达式的值依次匹配case的值,一旦匹配到,那就执行对应的代码,语句结束
如果都匹配不上,那就执行case _:对应的语句,语句结束.类似于if else里的else
case后面必须是具体值,不能是表达式.
下面我们来看代码
y = input("请输入今天是星期几:") match y: case 1: print('今天是星期一') case 4: print('今天是疯狂星期四') case 5: print('再努力一下明天就周末了呢') case 6|7: print('今天是周末额!') case _: print('吃苦耐劳打工日')
这里就会根据用户输入的数字来进行匹配,如果不在1,4,5,6,7 就会匹配最后的吃苦耐劳打工日
但是最后的这个case _: 其中_号并不是固定的.我们来看这个例子
p = eval(input('请输入坐标(x,y):')) match p: case (0,0): print('坐标在起始点.') case (0,y): print(f'坐标在Y轴上,距离原点{abs(y)}') case (x,0): print(f'坐标在X轴上,偏移{abs(x)}') case (x,y): print(f"坐标{p}偏离原点{abs(x+y*1j)}")
case <变量> 是用来捕捉匹配不到的情况的 当有多个变量时,我们只要匹配到了一个,其余的变量可以命名变量名来捕捉,同样最后捕捉就是全部未匹配的情况
match case不只是代替if else这么简单 他还有一个功能 模式匹配
list1 = [int(x) for x in input('请输入多个数字,用空格分隔').split()] match list1: case []: print('这是个空列表') case [1,two]: print((f'这个列表以1开头,第二个数是{two}')) case [1,_,third]: print(f'这是一个1开头的列表,第三个数是{third}') case [1,*_,end]: print(f'这是一个以为1开头的列表,最后一个数字是{end}') case [*_,2]: print('这是一个以2结尾的列表') case _: print('这个列表不在我的知识库范围内')
这个例子中,我们做了多次匹配,我们发现只要在指定位置匹配上一次,那么我们就可以指定变量来捕获其他任意值.
import random a = [0,0,1] change = input('是否要交换') win1 = 0 win2 = 0 for _ in range(10000): random.shuffle(a) #随机将列表的值打乱 user1,user2,user3 = a #赋值 if change == 'yes': match a: case [_,0,_] : win1 += user3 win2 += user1 case [_,_,0]: win1 += user2 win2 += user1 else: match a: case [_, 0, _]: win1 += user1 win2 += user3 case [_, _, 0]: win1 += user1 win2 += user2 print(win1,win2) #三门问题 模拟当用户选择第一个门后 随机打开剩下的两扇门内为0的那一扇,问你要不要交换.交换还是不交换胜率高.
而我们也可以在case的时候加上if判断条件
a = [int(x) for x in input('请输入两个数字').split()] match a: case (x,y) if x > 1 and y > 1: print(f'{x}和{y}都大于1') case (x,y) if x > 1 and y < 1: print(f'{x}大于1,{y}小于1') case _: print('我判断不了这两个数字')此外
此外,case并不会对格式过多的计较,比如上面的例子中,将列表传入, 而case判断的对象是元祖,并不影响他的判断.
此外match可以方便的捕捉字典中的value值
dic_p = {'x':20,"y":50} match dic_p: case {'x':0,"y":0}: print('匹配到两个都是0') case {'x':20,"y":y}: #我们可以匹配字典其中一个的值,并且将另一个用变量捕获 print(f'匹配到x是 y是 {y}') case{'x':x,"y":y}: #甚至可以两个都用变量捕获,只需要key能匹配 print(f'匹配到x是{x},y是{y}') case canot: print(f'未能成功匹配,字典是{canot}') #未能匹配的判断,也不是非要用占位符_ 而是可以用变量,这样就能捕捉变量