python小技巧--用字典映射代替switch case语句

python没有自己的switch case语句,官方推荐是用if else语句实现。但实际上用字典映射的方法也可以实现。

比如我们要实现在C语言里这样的代码:

day =1
switch(day){
  case 0 : day_name='Sunday';break;
  case 1 : day_name='Monday';break;
  default: day_name='unknown';break;
}

用字典映射可以这样实现:

day = 1
switcher = {
    0 : 'Sunday',
    1 : 'Monday',
}
day_name = switcher[day]

但是这样有个小问题,switch case语句下每种情况都可以写很多代码,是个语句块。所以我们还可以这样来实现,将原来字典里映射的每种情况的字符串改为函数名。在函数下就可以完成更多的操作了。代码如下:

day = 3
def get_Sunday():
    print("Sunday")
    return 'Sunday'
def get_Monday():
    print("Monday")
    return 'Monday'
def get_default():
    print("Unknown")
    return 'Unknown'
switcher = {
    0 : get_Sunday(),
    1 : get_Monday()
}
day_name = switcher.get(day,get_default)()
print(day_name)

以上代码存在很严重的问题,会将字典中包含的每个函数都执行一遍,如下图所示,也就是评论区指出的问题。

另外,如果选择的是key值是字典中有的,就会导致下面的错误。可以说这个代码是千疮百孔。。。感谢各位评论指出问题!!

> TypeError: 'str' object is not callable

最近重新回来看了一下这个问题,发现是switcher中的函数不能加括弧。将代码改成下面这样,就能够正确执行了。

day = 1
def get_Sunday():
    print("Sunday")
    return 'Sunday'
def get_Monday():
    print("Monday")
    return 'Monday'
def get_default():
    print("Unknown")
    return 'Unknown'
switcher = {
    0 : get_Sunday,
    1 : get_Monday
}
day_name = switcher.get(day,get_default)()
print(day_name)

结果如下:可以发现确实是只执行了get_Monday函数。

再次感谢评论区指出的错误!

上述技巧来源于慕课网七月老师的python实战视频。另外,需要好好反思一下自己看视频不认真....没注意到括弧,看来还是太年轻了。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破落之实

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值