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])()

猜你喜欢

转载自blog.csdn.net/u011090984/article/details/130482231