gpt4 book ai didi

使用 Python 实现简单的 switch/case 语句的方法

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章使用 Python 实现简单的 switch/case 语句的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

在Python中是没有Switch / Case语句的,很多人认为这种语句不够优雅灵活,在Python中用字典来处理多条件匹配问题字典会更简单高效,对于有一定经验的Python玩家不得不承认,的确如此.

但今天我们还是来看看如果一定要用Python来Switch / Case,可以怎么玩.

语法约束 。

我们先定义一下Switch/Case应该怎么表达,为了简单我们可以让它长成这样.

?
1
2
3
4
5
6
7
def cn():
   print ( 'cn' )
def us():
   print ( 'us' )
switch(lang).case( 'cn' ,cn)
truetruetrue.case( 'us' ,us)
    .default(us)

类实现一 。

通过以上约束,我们可以把switch当成一个类来实现,传入的参数在构造函数里处理,然后再分别实现case和default方法即可.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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 分支的函数.

看上去还不错,我们来试用一下.

?
1
2
3
4
5
6
7
8
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.

?
1
2
3
4
5
6
7
8
9
# 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
>>> <python_switch_case.switch object at 0x11034fb70 >

发现了没有,上面的实现不会处理重复的case,当然你可以加强一下case方法,最好是抛出异常,其他编程语言通常都这样做.

第二个问题,你希望从case里拿到返回值,像上面的写法是没希望了,因为扔掉了。我们可以考虑在switch类里加一个result的变量来保存执行结果.

?
1
2
3
4
5
6
7
8
class switch( object ):
   def __init__( self , case_path):
     ...
     self .result = None
   def case( self , key, method):
     ...
     self .result = method()
   ...

在调用结束后,就可以通过 result 拿到结果了.

?
1
2
3
_ = switch( 'cn' ).case( 'cn' ,cn).case( 'us' ,us)
_.result
>>> cn

类实现二 。

我大概在网上搜了一下,你还可以参考 Brian Beck 通过类来实现Swich/Case.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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 False
c = '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问题,一般我们可以通过字典来处理这种多分支的问题,举例说明.

?
1
2
3
4
5
6
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} 。

调用时可以像这样 。

?
1
2
3
try :
  switch[ "value" ]() #执行相应的方法。
except KeyError as e:

  pass 或 functionX #执行default部分 。

简单代码如下:

?
1
2
3
4
5
6
7
8
9
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 语句的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。

原文链接:https://betacat.online/posts/2018-09-16/python-switch-case 。

最后此篇关于使用 Python 实现简单的 switch/case 语句的方法的文章就讲到这里了,如果你想了解更多关于使用 Python 实现简单的 switch/case 语句的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com