python为什么不支持switch
1. switch是什么
switch语句的语法格式如下:
switch(expression){
case value1:
//语句
break; //可选
case value2:
//语句
break; //可选
default: //可选
//语句
}
使用流程图来表示:
它的用法为:switch语句的值满足哪个case的情况,就会执行对应代码块,执行时遇到break就跳出,否则就继续执行下一个case分支。一般会在最后放一个default兜底。
大多数语言都提供了switch语句或者及其相似的东西,比如在C/C++/Java/Go等静态语言中,它们都支持switch-case结构。
switch语句的好处是支持“单条件多分支”的选择结构,相比if-else的二分选择结构,在某些时候会更加简洁清晰。
但是在python中,我们看不到switch-case或者相近的语法结构。
2. Python为什么不支持switch
曾经有人提出过一些提案(PEP-275和PEP-3103),想给python引入switch语法,然而,对于“是否以及如何进行靶场测试”,大家没有达成一致的共识,最终导致提案流产。
3. switch-case替代方案
官方文档中有一篇FAQ给出了几个建议,告诉我们几个switch-case的替代方案:
- 使用if-elif-else条件判断语句
- 使用字典。将case值与调用的函数映射起来
- 使用内置getattr()检索特定的对象调用方法
3.1. 示例一:使用if条件判断语句实现
#判断今天是星期几,打印对应课程
from datetime import datetime
def taskforMath():
print("今天上数学课")
def taskforChinese():
print("今天上语文课")
def taskforRest():
print("今天休息")
def taskforArt():
print("今天上美术课")
def taskforDance():
print("今天上舞蹈课")
def taskforDefault():
print("输入错误啦。。。。")
# 获取今天是星期几,返回int
dayofWeek=datetime.today().weekday()
# ——————————————————使用if-elif-else方式替代switch————————————————————
if dayofWeek==0:
taskforMath()
elif dayofWeek==1:
taskforChinese()
elif dayofWeek in [2,5,6]:
taskforRest()
elif dayofWeek==3:
taskforArt()
elif dayofWeek==4:
taskforDance()
else:
taskforDefault()
3.2. 示例二:使用字典实现
#判断今天是星期几,打印对应课程
from datetime import datetime
def taskforMath():
print("今天上数学课")
def taskforChinese():
print("今天上语文课")
def taskforRest():
print("今天休息")
def taskforArt():
print("今天上美术课")
def taskforDance():
print("今天上舞蹈课")
def taskforDefault():
print("输入错误啦。。。。")
# 获取今天是星期几,返回int类型
dayofWeek=datetime.today().weekday()
# -------------------使用字典方式替代switch,创建星期与课程的映射关系-----------------
dict={
"星期一":taskforMath,"星期二":taskforChinese,"星期三":taskforRest,"星期四":taskforArt,"星期五":taskforDance,"星期六":taskforRest,"星期日":taskforRest}
todayis=list(dict.keys())[dayofWeek]
# dict[todayis]() # 这种写法无法在这一步设置默认打印,需要将默认写进dict中
dict.get(todayis,taskforDefault)()
3.3. 示例三:使用内置getattr()
#判断今天是星期几,打印对应课程
from datetime import datetime
class A:
def taskforMath(self):
print("今天上数学课")
def taskforChinese(self):
print("今天上语文课")
def taskforRest(self):
print("今天休息")
def taskforArt(self):
print("今天上美术课")
def taskforDance(self):
print("今天上舞蹈课")
def taskforDefault(self):
print("输入错误啦。。。。")
# 获取今天是星期几,返回int
dayofWeek=datetime.today().weekday()
a=A()
task=["taskforMath","taskforChinese","taskforRest","taskforArt","taskforDance","taskforRest","taskforRest","taskforDefault"]
getattr(a,task[dayofWeek])()