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}')
        #未能匹配的判断,也不是非要用占位符_ 而是可以用变量,这样就能捕捉变量

  

posted @ 2025-03-07 16:28  叶无齐  阅读(220)  评论(0)    收藏  举报

python学习之路

[python随笔]