zoukankan      html  css  js  c++  java
  • [转载] Python没有switch语句的解决方法

    from http://i.azpala.com/2008/01/20/python-switch/

    其他语言中,switch语句大概是这样的

    switch (var)
    {
        case value1: do_some_stuff1();
        case value2: do_some_stuff2();
        ...
        case valueN: do_some_stuffN();
        default: do_default_stuff();
    }

    python本身没有switch语句,解决方法有以下3:

    A.使用dictionary

    values = {
               value1: do_some_stuff1,
               value2: do_some_stuff2,
               ...
               valueN: do_some_stuffN,
             }
    values.get(var, do_default_stuff)()

    具体请参考: Python switch statement

    这个方法的缺点是:我不知道do_some_stuff是不是允许多个语句,如何实现,

    也许是可以的,我不知道-.-

    B.使用lambda

    在PHP中,

    switch ($value) {
        case 'a':
           $result = $x * 5;
            break;
        case 'b':
            $result = $x + 7;
            break;
        case 'c':
            $result = $x - 2;
            break;
    }

    在python中:

    result = {
     'a'lambda x: x * 5,
     'b'lambda x: x + 7,
     'c'lambda x: x - 2
    }[value](x)

    具体参考: Switch statements in Python

    C.Brian Beck提供了一个类 switch 来实现其他语言中switch的功能

    # This class provides the functionality we want. You only need to look at
    #
     this if you want to know how this works. It only needs to be defined
    #
     once, no need to muck around with its internals.
    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: # changed for v1.5, see below
                self.fall = True
                return True
            else:
                return False
     
    # The following example is pretty much the exact use-case of a dictionary,
    #
     but is included for its simplicity. Note that you can include statements
    #
     in each suite.
    v = 'ten'
    for case in switch(v):
        if case('one'):
            print 1
            break
        if case('two'):
            print 2
            break
        if case('ten'):
            print 10
            break
        if case('eleven'):
            print 11
            break
        if case(): # default, could also just omit condition or 'if True'
            print "something else!"
            # No need to break here, it'll stop anyway

  • 相关阅读:
    oracle 11g wm_concat 、 listagg 函数的使用(合并数据)
    Quartz.net 开源job调度框架(二)----定点执行
    Quartz.net 开源job调度框架(一)
    Quartz.NET
    基于ASP.NET的comet简单实现
    W3wp.exe占用CPU及内存资源
    SysTick Software Timer
    ARM Memory Copy
    ARM LDR/STR, LDM/STM 指令
    STM32 USART 波特率计算
  • 原文地址:https://www.cnblogs.com/iamfy/p/2363995.html
Copyright © 2011-2022 走看看