|
我们知道,python是没有switch语句的,所以当我们要实现这样结构的逻辑时:varindex=10switchindex{case100:print("index的值为100")case10,15:print("index的值为10或15")case5:print("index的值为5")default:print("默认case")}经常需要用多个if-else来实现。除此之外,我们还可以考虑用字典对应提取的方式来实现,下面我们给出四种实现switch的方法,并对比这四种方法的运行时间something='something'#第一种,多次使用if-else结构ifsomething=='this':the_thing=1elifsomething=='that':the_thing=2elifsomething=='there':the_thing=3else:the_thing=4#第二种,用get设置默认值的字典提取options={'this':1,'that':2,'there':3}the_thing=options.get(something,4)#第三种,用if-else配合不设置默认值的字典提取options={'this':1,'that':2,'there':3}ifsomethinginoptions:the_thing=options[something]else:the_thing=4#第四种,用collections模块设置默认值进行字典提取fromcollectionsimportdefaultdictdefault_options=defaultdict(lambda:4,{'this':1,'that':2,'there':3})the_thing=default_options[something]下面我们对比一下这几种方式提取的速度,分成两种情况判断的内容在字典中判断的内容不在字典中在ifelse.py文件中输入如下内容importtimefromcollectionsimportdefaultdict#计算运行时间的装饰器defrun_time(func):defwrapper(*args,**kw):start=time.time()func(*args,**kw)end=time.time()print('running',end-start,'s')returnwrapper#准备好两个字典options={'this':1,'that':2,'there':3}default_options=defaultdict(lambda:4,{'this':1,'that':2,'there':3})#四种方法都定义成函数#接受参数something即待判断值#每次循环10000000次@run_timedeffirst(something):foriinrange(10000000):ifsomething=='this':the_thing=1elifsomething=='that':the_thing=2elifsomething=='there':the_thing=3else:the_thing=4@run_timedefsecond(something):foriinrange(10000000):the_thing=options.get(something,4)@run_timedefthird(something):foriinrange(10000000):ifsomethinginoptions:the_thing=options[something]else:the_thing=4@run_timedefforth(something):foriinrange(10000000):the_thing=default_options[something]#调用函数if__name__=='__main__':#判断的内容不在字典中first('something')second('something')third('something')forth('something')print('-'*20)#判断的内容在字典中first('this')second('this')third('this')forth('this')在命令行多次运行pythonifelse.py得到结果如下-------------第一次---------------running1.8487958908081055srunning1.63755202293396srunning0.7807505130767822srunning0.6786513328552246s--------------------running0.7807483673095703srunning2.075996160507202srunning1.0349910259246826srunning0.740731954574585s-------------第二次---------------running1.7757258415222168srunning1.6395549774169922srunning0.8408102989196777srunning0.7977871894836426s--------------------running0.710662841796875srunning1.9098539352416992srunning1.042982578277588srunning0.8197875022888184s-------------第三次---------------running1.5885050296783447srunning1.8237719535827637srunning0.9819226264953613srunning0.78375244140625s--------------------running0.6226155757904053srunning1.634549617767334srunning0.947911262512207srunning0.6586313247680664s从结果中可以看出1.四种方法之间的对比,后两种方法明显比前两种方法快,且最后一种方法总是最快的。2.待判断内容是否在字典中设置的对比第一种全程if-else判断的情况下,早判断出来程序就会早结束,所以if-else判断的内容顺序是有讲究的而从字典里提取则没有看出显著的不同由于使用collections模块中的defaultdict虽然最快,但是会占用较多内存,所以最推荐的是第三种方法,使用if-else配合无默认字典提取方法。在Python中,没有内置的switch语句,但是可以使用多种方式实现类似switch的操作。以下是几种实现方法:使用字典:pythondefswitch(key):return{'a':'casea','b':'caseb','c':'casec',}.get(key,'default')print(switch('a'))#输出:caseaprint(switch('d'))#输出:default使用if-elif-else语句:pythondefswitch(key):ifkey=='a':return'casea'elifkey=='b':return'caseb'elifkey=='c':return'casec'else:return'default'print(switch('a'))#输出:caseaprint(switch('d'))#输出:default使用函数装饰器和字典:pythondefswitch(key)dict_of_functions.get(key,lambda:'default')defdefault():return'casea'defcase_b():return'caseb'defcase_c():return'casec'dict_of_functions={'a':default,'b':case_b,'c':case_c,}returnswitch(key)()print(switch('a'))#输出:caseaprint(switch('d'))#输出:default使用类装饰器和字典:pythonclassSwitch:def__init__(self,key):self.key=key@propertydefcase(self):return{'a':'casea','b':'caseb','c':'casec',}.get(self.key,'default')print(Switch('a').case)#输出:caseaprint(Switch('d').case)#输出:default以上就是Python中实现类似switch操作的几种方法。python语言中,没有内置switch函数,如果用if-else语句的话,当分支数量很大时,会显得很臃肿,下面是使用python中的字典,实现switch语句功能的方法。#设置flag的值,用于选择执行哪个函数flag=0#设置自定义函数defget_function_1():#函数功能return'Function_1'defget_function_2():#函数功能return'Function_2'defget_function_3():#函数功能return'Function_3'defget_default():#函数功能return'Others'#字典中不同的值对应不同的自定义函数switcher={0:get_function_1,1:get_function_2,2:get_function_3}#根据flag的值决定执行哪一个函数,如果输入的值在字典中没有,则执行get_default函数output=switcher.get(flag,get_default)()print("Theoutputofswitcheris:",output)如果语句不复杂,也可以使用lambda表达式,可以使代码更简洁,lambda表达式介绍见Pythonlambda介绍-Goodpy-博客园www.cnblogs.com/evening/archive/2012/03/29/2423554.html下面是利用了字典和lambda表达式,实现switch语句功能flag=0#如果字典中没有flag的值,则执行get_default函数defget_default(x):#函数功能return'None'switcher={0:lambdax:x+1,1:lambdax:x**2,2:lambdax:abs(x)}output=switcher.get(flag,get_default)(5)print("Theoutputofswitcheris:",output)作者:书海阅读岛链接:https://www.zhihu.com/question/591024612/answer/2953371599来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ython已有特性Python中的函数是可以作为变量存在的,也就是可以将函数复制给变量,变量可以作为字典的value存在,也就是函数可以作为字典的value,对应了switch中的基本特性1if-else可以让程序存在多种不同的分支,可以用来实现基本特性2中的默认逻辑字典的key和value是一对一或者多对一的,就是每个key对应一个value,但是一个value可以有多个key;这点对应了switch的基本特性3需要添加的特性从Python已有特性上来说,我们看起来不需要添加什么新的新特性,只需要把已有特性组合下就行组合特性这里以一个课本中的题目来做例子:百分制转字母分,也就是——90分及以上是A,80分及以上是B,70分及以上是C,60分及以上是D,60分以下都是E定义一个字典,key是条件,value是函数,把条件和对应的逻辑组合起来#定义各种函数defis_a():return'A'defis_b():return'B'defis_c():return'C'defis_d():return'D'defis_e():return'E'#为了方便处理,分数先除以10向下取整,按取整结果选执行逻辑#定义switch-case跳转表,这里90分及以上是A,80分及以上是B,70分及以上是C,60分及以上是Dswitch_dict={10:is_a,9:is_a,8:is_b,7:is_c,6:is_d,}用if-else语句处理能找的到条件的执行逻辑和找不到条件的执行逻辑,也就是实现匹配和默认情况ifscore_div_teninswitch_dict.keys():#在switch_dict里有对应的逻辑returnswitch_dict[score_div_ten]()else:#没在switch_dict里的按默认逻辑处理returnis_e()全部代码#!/usr/bin/python#-*-coding:utf8-*-importmathdefis_a():return'A'defis_b():return'B'defis_c():return'C'defis_d():return'D'defis_e():return'E'defscore_to_af(score):#分数除以10以后向下取整,算是属于几十分score_div_ten=math.floor(score/10)#定义switch-case跳转表,这里90分及以上是A,80分及以上是B,70分及以上是C,60分及以上是D,60分以下都是E(default)switch_dict={10:is_a,9:is_a,8:is_b,7:is_c,6:is_d,}ifscore_div_teninswitch_dict.keys():returnswitch_dict[score_div_ten]()else:returnis_e()if__name__=='__main__':forscoreinrange(0,101):print('score:%d,af:%s'%(score,score_to_af(score)))执行结果score:0,af:Escore:1,af:Escore:2,af:Escore:3,af:Escore:4,af:Escore:5,af:Escore:6,af:Escore:7,af:Escore:8,af:Escore:9,af:Escore:10,af:Escore:11,af:Escore:12,af:Escore:13,af:Escore:14,af:Escore:15,af:Escore:16,af:Escore:17,af:Escore:18,af:Escore:19,af:Escore:20,af:Escore:21,af:Escore:22,af:Escore:23,af:Escore:24,af:Escore:25,af:Escore:26,af:Escore:27,af:Escore:28,af:Escore:29,af:Escore:30,af:Escore:31,af:Escore:32,af:Escore:33,af:Escore:34,af:Escore:35,af:Escore:36,af:Escore:37,af:Escore:38,af:Escore:39,af:Escore:40,af:Escore:41,af:Escore:42,af:Escore:43,af:Escore:44,af:Escore:45,af:Escore:46,af:Escore:47,af:Escore:48,af:Escore:49,af:Escore:50,af:Escore:51,af:Escore:52,af:Escore:53,af:Escore:54,af:Escore:55,af:Escore:56,af:Escore:57,af:Escore:58,af:Escore:59,af:Escore:60,afscore:61,afscore:62,afscore:63,afscore:64,afscore:65,afscore:66,afscore:67,afscore:68,afscore:69,afscore:70,af:Cscore:71,af:Cscore:72,af:Cscore:73,af:Cscore:74,af:Cscore:75,af:Cscore:76,af:Cscore:77,af:Cscore:78,af:Cscore:79,af:Cscore:80,af:Bscore:81,af:Bscore:82,af:Bscore:83,af:Bscore:84,af:Bscore:85,af:Bscore:86,af:Bscore:87,af:Bscore:88,af:Bscore:89,af:Bscore:90,af:Ascore:91,af:Ascore:92,af:Ascore:93,af:Ascore:94,af:Ascore:95,af:Ascore:96,af:Ascore:97,af:Ascore:98,af:Ascore:99,af:Ascore:100,af:A思路2的思考过程一段if-elif-else代码defscore_to_af2(score):#分数除以10以后向下取整,算是属于几十分score_div_ten=math.floor(score/10)if9
|
|