在Python中是没有Switch / Case语句的,很多⼈认为这种语句不够优雅灵活,在Python中⽤字典来处理多条件匹配问题字典会更简单⾼效,对于有⼀定经验的Python玩家不得不承认,的确如此。但今天我们还是来看看如果⼀定要⽤Python来Switch / Case,可以怎么玩。语法约束
我们先定义⼀下Switch/Case应该怎么表达,为了简单我们可以让它长成这样。
def cn(): print('cn')def us(): print('us')
switch(lang).case('cn',cn)truetruetrue.case('us',us) .default(us)
类实现⼀
通过以上约束,我们可以把switch当成⼀个类来实现,传⼊的参数在构造函数⾥处理,然后再分别实现case和default⽅法即可。
class switch(object):
def __init__(self, case_path): self.switch_to = case_path self._invoked = False
def case(self, key, method):
if self.switch_to == key and not self._invoked: self._invoked = True method() return self
def default(self, method): if not self._invoked: self._invoked = True method()
在构造函数中我们记住了 case_path 和执⾏状态 _invoked ,在 case() ⾥如果当前的 key 和 switch_to 匹配并且函数没有被执⾏过,那么就更新 _invoked 并执⾏对应的⽅法。在 default() ⾥检查⼀下 _invoked ,如果从没执⾏过,那么就调⽤ default 分⽀的函数。
看上去还不错,我们来试⽤⼀下。
switch('cn').case('cn',cn).case('us',us).default(fail)>>> cn
switch('us').case('cn',cn).case('us',us).default(fail)>>> cn
switch('jp').case('cn',cn).case('us',us).default(fail)>>> fail
switch('cn').case('cn',cn).case('us',us)>>> cn
让我们来看⼏个奇葩⼀点的case。
# duplicate case
switch('us').case('us',cn).case('us',us).default(fail)>>> cn
def cn() return 'cn'def us() return 'us'# return value
result = switch('cn').case('cn',cn).case('us',us)result
>>> 发现了没有,上⾯的实现不会处理重复的case,当然你可以加强⼀下case⽅法,最好是抛出异常,其他编程语⾔通常都这样做。 第⼆个问题,你希望从case⾥拿到返回值,像上⾯的写法是没希望了,因为扔掉了。我们可以考虑在switch类⾥加⼀个result的变量来保存执⾏结果。 class switch(object): def __init__(self, case_path): ... self.result = None def case(self, key, method): ... self.result = method() ... 在调⽤结束后,就可以通过 result 拿到结果了。 _ = switch('cn').case('cn',cn).case('us',us)_.result>>> cn 类实现⼆ 我⼤概在⽹上搜了⼀下,你还可以参考 Brian Beck 通过类来实现Swich/Case。 class switch(object): def __init__(self, value): self.value = value self.fall = False def __iter__(self): \"\"\"Return the match method once, then stop\"\"\" yield self.match raise StopIteration def match(self, *args): \"\"\"Indicate whether or not to enter a case suite\"\"\" if self.fall or not args: return True elif self.value in args: self.fall = True return True else: return Falsec = 'z' for case in switch(c): if case('a'): pass # only necessary if the rest of the suite is empty if case('c'): pass # ... if case('y'): pass if case('z'): print(\"c is lowercase!\") break if case('A'): pass # ... if case('Z'): print(\"c is uppercase!\") break if case(): # default print(\"I dunno what c was!\") 这种实现相对复杂⼀点,⽽且⽤起来也不是很舒服,⼜需要for⼜需要if(还不如直接if/else痛快)。当然也有好处,就是可以把相同结果的case放⼀起,⽽且case⾥可以写更多东西,不仅仅是⼀个⽅法名。写在最后 最后我们还是回到Python推崇的⽅法来处理switch/case问题,⼀般我们可以通过字典来处理这种多分⽀的问题,举例说明。 MAPPING = { 'cn': cn, 'us': us} lang = 'cn' result = MAPPING.get(lang, default=us) 是不是⼀⽬了然,不仅易于阅读也易于维护。在字典中key是唯⼀的,value可以是任意类型的数据,可以是类或者是⽅法,所以⾜够灵活。 下⾯通过代码再次学习python语⾔switch-case 初学python语⾔,竟然很久才发现python没有switch-case语句,查看官⽅⽂档说是可以⽤if-elseif-elseif。。。。代替。讲真,这都不是问题。不就是⼀个条件判断吗。⽤if-elseif-.......肯定没问题,同时也⽤其他的解决⽅案,⽐较简单的就是利⽤ 字典来实现同样的功能。写⼀个字典,每个key对应的值是⼀个⽅法。如switch = {\"valueA\":functionA,\"valueB\":functionB,\"valueC\":functionC} 调⽤时可以像这样 try: switch[\"value\"]() #执⾏相应的⽅法。except KeyError as e: pass 或 functionX #执⾏default部分简单代码如下: switch = { \"a\":lambda x:x*2, \"b\":lambda x:x*3, \"c\":lambda x:x**x } try: swtich[\"c\"](6) except KeyError as e: pass 如果不嫌⿇烦⾃⼰写⼀个swtich类来实现也没问题......不过真有这个必要吗总结 以上所述是⼩编给⼤家介绍的使⽤ Python 实现简单的 switch/case 语句的⽅法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持! 因篇幅问题不能全部显示,请点此查看更多更全内容