您的当前位置:首页正文

使用Python实现简单的switchcase语句的方法

2020-09-05 来源:年旅网
使⽤Python实现简单的switchcase语句的⽅法

在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 语句的⽅法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!

因篇幅问题不能全部显示,请点此查看更多更全内容