⑴pythonswitchcase语句(为什么Python中没有Switch/Case语句
⑵为什么Python中没有Switch/Case语句
⑶不同于我用过的其它编程语言,Python没有switch/case语句。为了实现它,我们可以使用字典映射:Pythondefnumbers_to_strings(argument):switcher={:“zero“,:“one“,:“two“,}returnswitcher.get(argument,“nothing“)这段代码类似于:Pythonfunction(argument){switch(argument){case:return“zero“;case:return“one“;case:return“two“;default:return“nothing“;};};Python代码通常比处理case的标准方法更为简短,也可以说它更难理解。当我初次使用Python时,感觉很奇怪并且心烦意乱。而随着时间的推移,在switch中使用字典的key来做标识符变得越来越习以为常。函数的字典映射在Python中字典映射也可以包含函数或者lambda表达式:Pythondefzero():return“zero“defone():return“one“defnumbers_to_functions_to_strings(argument):switcher={:zero,:one,:lambda:“two“,}#Getthefunctionfromswitcherdictionaryfunc=switcher.get(argument,lambda:“nothing“)#Executethefunctionreturnfunc()虽然zero和one中的代码很简单,但是很多Python程序使用这样的字典映射来调度复杂的流程。类的调度方法如果在一个类中,不确定要使用哪种方法,可以用一个调度方法在运行的时候来确定。PythonclassSwitcher(object):defnumbers_to_methods_to_strings(self,argument):“““Dispatchmethod“““#prefixthemethod_namewith’number_’becausemethodnames#cannotbeginwithaninteger.method_name=’number_’+str(argument)#Getthemethodfrom’self’.Defaulttoalambda.method=getattr(self,method_name,lambda:“nothing“)#Callthemethodaswereturnitreturnmethod()defnumber_(self):return“zero“defnumber_(self):return“one“defnumber_(self):return“two“很灵活,对吧?官方说明官方的解释说,“用if...elif...elif...else序列很容易来实现switch/case语句”。而且可以使用函数字典映射和类的调度方法。可以说官方的说明并没有解释什么,只是给出了解决方案。换句话说,没有回答为什么。我认为其实官方真正想说的是:“Python不需要switch/case语句”。真的是这样吗?是的。但是还有别的原因。我听牛人说过,在代码中switch/case语句真的很难调试。就我个人而言,我发现当运行到大量嵌套的用作代码分支映射的字典里,上述说法就站不住脚了。想想吧,一个超过条语句的嵌套字典,和一个嵌套个以上case的switch/case代码块一样,都是难以调试的。字典映射运行更快?Python没有case语句,使用其它语言的衡量标准是没有意义的,因为在某种语言中运行更快并不意味着在另一种语言中也一样。让我们继续。Python实现方法的显著优点有时候我会遇到Python的实现方法比switch/case语句更好用的情况,例如在运行的时候,需要从映射里添加或者删除一些潜在的选项。每当这时,多年来使用字典映射和调度方法的实践让我受益匪浅。现在我觉得,我再也无法回到依赖switch/case语句的日子了。结束语Python迫使我积累了很多映射的实践经验,对我来说是塞翁失马,焉知非福。没有switch/case语句可用的约束,促使我想到了可能不会用来开发的方法和主意。有意或无意中,Python没有switch/case语句已成为一种社会建构,并让我成为一个更优秀的程序员。综上所述,所以我认为这种意外的社会构建解释比官方的“用这个来代替”的说明要好得多。
⑷为什么Python中没有Switch/Case语句
⑸你可以轻松地足够的序列,如果……elif……elif……其他的事情。有一些建议switch语句的语法,但是没有共识(还)是否和如何做测试。看到完整的细节和PEP当前状态。python语法讲究简单明了,ifelse完全可以很简单的实现switch的所有功能,没必要用switch。的情况你需要选择从大量的可能性,您可以创建一个字典中值映射到函数调用。例如:deffunction_(...):...functions={’a’:function_,’b’:function_,’c’:self.method_,...}func=functionsfunc()对于调用对象的方法,可以进一步简化使用getattr()内置的检索方法与一个特定的名称:defvisit_a(self,...):......defdispatch(self,value):method_name=’visit_’+str(value)method=getattr(self,method_name)method()建议你使用一个方法名的前缀,如visit_在这个例子。没有这样的一个前缀,如果值是来自一个不受信任的源,攻击者能够调用任何方法在你的对象。
⑹python中有没有switch-case语句
⑺没有,需要用if…elif…else语句代替,或者自己写一个字典(dict实现。
⑻为什么Python中没有Switch/Case语句
⑼为了语法统一,可以使用下面的if代替switch
⑽if?a==:????passelif?a==:????passelif?a==:????pass
⑾为什么Python中没有Switch/Case语句
⑿因为作为一门解释型语言,switch/case是没有存在必要的,if/elif/else就可以实现的功能,为什么要再提供重复的?ifelse的得一个if一个if的判断过去,如果匹配的是最后一个条件,前面所有if都得判断一遍的。看过汇编就知道,C语言的switch/case,在case值连续的时候,是可以根据case值直接计算该跳转的地址的。
⒀为什么Python中没有Switch/Case语句
⒁官方的解释说,“用if…elif…elif…else序列很容易来实现switch/case语句”。而且可以使用函数字典映射和类的调度方法。可以说官方的说明并没有解释什么,只是给出了解决方案。换句话说,没有回答为什么。我认为其实官方真正想说的是:“Python不需要switch/case语句”。
⒂Python那些优雅的写法:switch-case
⒃实际上Python是没有所谓的switchcase写法的,熟悉C艹和Java的同学可能已经习惯了用switchcase结构去优雅的处理一些事情,比如这样:
⒄但是在Python中,官方对switchcase的需求是这样回复的:“Youcandothiseasilyenoughwithasequenceofif...elif...elif...else.Therehavebeensomeproposalsforswitchstatementsyntax,butthereisnoconsensus(yet)onwhetherandhowtodorangetests.“感觉有点low。
⒅可用字典方法解决这个问题:
⒆Python里怎么实现switchcase
⒇学习Python过程中,发现没有switch-case,过去写C习惯用Switch/Case语句,官方文档说通过if-elif实现。所以不妨自己来实现Switch/Case功能。方法一通过字典实现deffoo(var):return{’a’:,’b’:,’c’:,}.get(var,’error’)#’error’为默认返回值,可自设置方法二通过匿名函数实现deffoo(var,x):return{’a’:lambdax:x+,’b’:lambdax:x+,’c’:lambdax:x+,}(x)方法三通过定义类实现参考BrianBeck通过类来实现Swich-case#Thisclassprovidesthefunctionalitywewant.Youonlyneedtolookat#thisifyouwanttoknowhowthisworks.Itonlyneedstobedefined#once,noneedtomuckaroundwithitsinternals.classswitch(object):def__init__(self,value):self.value=valueself.fall=Falsedef__iter__(self):“““Returnthematchmethodonce,thenstop“““yieldself.matchraiseStopIterationdefmatch(self,*args):“““Indicatewhetherornottoenteracasesuite“““ifself.fallornotargs:returnTrueelifself.valueinargs:#changedforv.,seebelowself.fall=TruereturnTrueelse:returnFalse#Thefollowingexampleisprettymuchtheexactuse-caseofadictionary,#butisincludedforitssimplicity.Notethatyoucanincludestatements#ineachsuite.v=’ten’forcaseinswitch(v):ifcase(’one’):printbreakifcase(’two’):printbreakifcase(’ten’):printbreakifcase(’eleven’):printbreakifcase():#default,couldalsojustomitconditionor’ifTrue’print“somethingelse!“#Noneedtobreakhere,it’llstopanyway#breakisusedheretolookasmuchliketherealthingaspossible,but#elifisgenerallyjustasgoodandmoreconcise.#Emptysuitesareconsideredsyntaxerrors,sointentionalfall-throughs#shouldcontain’pass’c=’z’forcaseinswitch(c):ifcase(’a’):pass#onlynecessaryiftherestofthesuiteisemptyifcase(’b’):pass#...ifcase(’y’):passifcase(’z’):print“cislowercase!“breakifcase(’A’):pass#...ifcase(’Z’):print“cisuppercase!“breakifcase():#defaultprint“Idunnowhatcwas!“#AssuggestedbyPierreQuentel,youcanevenexpanduponthe#functionalityoftheclassic’case’statementbymatchingmultiple#casesinasingleshot.Thisgreatlybenefitsoperationssuchasthe#uppercase/lowercaseexampleabove:importstringc=’A’forcaseinswitch(c):ifcase(*string.lowercase):#notethe*forunpackingasargumentsprint“cislowercase!“breakifcase(*string.uppercase):print“cisuppercase!“breakifcase(’!’,’?’,’.’):#normalargumentpassingstylealsoappliesprint“cisasentenceterminator!“breakifcase():#defaultprint“Idunnowhatcwas!“#SincePierre’ssuggestionisbackward-patiblewiththeoriginalrecipe,#Ihavemadethenecessarymodificationtoallowfortheaboveusage.查看Python官方:PEP-ASwitch/CaseStatement发现其实实现SwitchCase需要被判断的变量是可哈希的和可比较的,这与Python倡导的灵活性有冲突。在实现上,优化不好做,可能到最后最差的情况汇编出来跟IfElse组是一样的。所以Python没有支持。
⒈为什么Python中没有Switch/Case语句
⒉这个问题这么理解:switchcase可以由ifelseelif实现。还有因为python是动态解释型语言。switchcase主要在编译型语言中。因为编译型语言能知道具体跳到那一行。是不是合法的。但是解释语言她更不不知道下一行是啥,只有执行到才能知道本行是不是语法正确等等
⒊为什么Python中没有Switch/Case语句
⒋同于我用过的其它编程语言,Python没有switch/case语句。为了实现它,我们可以使用字典映射:
⒌Python代码通常比处理case的标准方法更为简短,也可以说它更难理解。当我初次使用Python时,感觉很奇怪并且心烦意乱。而随着时间的推移,在switch中使用字典的key来做标识符变得越来越习以为常。
⒍在Python中字典映射也可以包含函数或者lambda表达式:
⒎虽然?zero?和?one?中的代码很简单,但是很多Python程序使用这样的字典映射来调度复杂的流程。
⒏如果在一个类中,不确定要使用哪种方法,可以用一个调度方法在运行的时候来确定。很灵活,对吧?
⒐官方文档的解释说,“用if...elif...elif...else序列很容易来实现switch/case语句”。而且可以使用函数字典映射和类的调度方法。