Python实现switch/case语句的方法


本文摘自php中文网,作者不言,侵删。

本篇文章给大家带来的内容是关于Python实现switch/case语句的方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

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

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

语法约束

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

1

2

3

4

5

6

7

8

9

def cn():

    print('cn')

 

def us():

    print('us')

 

switch(lang).case('cn',cn)

            .case('us',us)

               .default(us)

类实现一

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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()里如果当前的keyswitch_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

10

11

# 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

9

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

34

35

36

37

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

7

MAPPING = {

    'cn': cn,

    'us': us

}

 

lang = 'cn'

result = MAPPING.get(lang, default=us)

是不是一目了然,不仅易于阅读也易于维护。在字典中key是唯一的,value可以是任意类型的数据,可以是类或者是方法,所以足够灵活。

以上就是Python实现switch/case语句的方法的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

详解Python中for循环的工作原理

Python如何随机生成10个整数

Python设置环境变量有什么用?

Python如何运行一个Python程序

Python怎么下载64位的

Python如何安装opencv库

Python利用os模块批量修改文件名的方法介绍(附代码)

使用pip安装Python库的几种常用方法

Python阶乘函数怎么使用

Python的快速排序方法

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...