背景
Python 2.x和3.x早期版本一直没有提供switch case的语法支持。为了实现类似的逻辑,我们不得不使用一连串的if
和elif
判断分支,代码十分的冗长可读性不高。
Python 3.10终于为我们带来了switch case 语法的支持。但问题来了,我们在愉快享受新版本switch case的便利之时,老版本的兼容性就被丢掉了。现阶段我们不得不考虑如何写出同时兼容Python2和Python3的代码。
下面为大家带来一种较为简洁易读,并且又兼容Python2和Python3的switch case
功能代码的写法。
示例写法
为了方便说明,本人将swtich case
逻辑封装在了switch_method
方法。代码和示例如下所示。
def switch_method(i):
return {
i <= 4: 0,
4 < i <= 8: 1,
8 < i <= 16: 2,
i > 16: 3
}[1]
if __name__ == '__main__':
print(switch_method(2))
print(switch_method(5))
print(switch_method(12))
print(switch_method(20))
运行结果:
0
1
2
3
分析:
这里使用Python的dict
来表示条件和结果值之前的关系。dict
的key
返回的是布尔类型。在传入参数后,实际上这个dict
的值为{True:'value1', False:'value2'}
。为什么说这里的True和False只出现一次呢?因为dict的key是不能重复的。如果key
相同,原来这个key
对应的value
会被替换。
dict
的作用搞明白了,那么最后的[1]
意思是什么呢?[1]
相当于[True]
。由于这个字典的key
是布尔类型,1
会被隐式转换为True
。意思也就是获取True
这个key
对应的值。
综上,switch_method
方法的执行效果为,逐个匹配dict
中key
的条件表达式,找到匹配的条件,获取它对应的值。
注意事项:dict
中的条件不要相互重叠,意思就是一个值匹配多个条件。因为在Python 3.6之前字典是无序的,我们没法保证条件匹配的顺序。对于同一个值,匹配的结果很可能不同,极易造成很隐蔽的bug,务必引起注意。
网友评论