在linux的shell中我们习惯使用case语句来做分支处理,然而Python中却省略了这个函数,经过多方查找,发现其实case语句在C语言中是通过查对应的hash表,来进行跳转的。在Python中我们可以通过三种方法来实现这种功能。1、字典;2、lambda;3、switch类。

1、字典

dictCase={'case1':func1,'case2':func2....'caseN':funcN}

#注意字典中对应的是函数名,不要圆括号。

在调用的时候使用字典的get函数来实现default选项:

dictCase.get(caseN,default_Func)()

2、匿名函数lambda

网上常见的例子:

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

看不太懂。。。

def a(s):    print sdef switch(ch):    try:      {'1': lambda : a("one"),       '2': lambda : a("two"),      '3': lambda : a("three"),       'a': lambda : a("Letter a")      }[ch]()    except KeyError:      a("Key not Found")

eg:

>>switch('1')

one
>>switch('a')
Letter a
>>switch('b')
Key not Found

这个例子不错,但总觉的这样不太好看,没字典灵活。

我自己的例子:

  1 #!/usr/bin/env python   2 import sys  3     4 def f1(a):  5   print a  6             7 def b(b):  8   print b+1  9  10 g=lambda x:x 11  12 #m=sys.argv[1] 13 #n=sys.argv[2] 14 #print m,n 15 m=input("functionname:") 16 n=input("number:") 17 try: 18   g(m)(n) 19 except: 20   print "function not exists:{f1,b}" 21#使用try来实现default函数

3、安装switch类:

有了前面两种,安装这个类就有点无聊了。。。

# -*- coding: utf-8 -*-from __future__ import with_statement__version__ = '1.1.0'__all__ = ['CSwitch', 'Switch']import reclass Switch(object):    class StopExecution(Exception):        pass    def __init__(self, switch_value, fall_through=False):        self._switch_value = switch_value        self._default_fall_through = fall_through        self._fall_through = False        self._matched_case = False        self._default_used = False    def __enter__(self):        return self    def __exit__(self, exc_type, exc_val, exc_tb):        return exc_type is self.StopExecution    def __call__(self, case_value, *case_values, **kwargs):        return self.call(            lambda switch_value: any(switch_value == v for v in (case_value, ) + case_values),            **kwargs        )    def match(self, match_value, *match_values, **kwargs):        def test(switch_value):            # It is safe to call `re.compile()` on a compiled pattern:            # a=re.compile('test'); assert a is re.compile(a)            str_switch_value = str(switch_value)            re_tests = (re.compile(v) for v in (match_value, ) + match_values)            return any(regex.match(str_switch_value) for regex in re_tests)        return self.call(test, **kwargs)    def call(self, test, fall_through=None):        if self._default_used:            raise SyntaxError('Case after default is prohibited')        self._check_finished()        if self._fall_through or test(self._switch_value):            self._matched_case = True            self._fall_through = fall_through if fall_through is not None else self._default_fall_through            return True        return False    @property    def default(self):        self._check_finished()        self._default_used = True        return not self._matched_case    def _check_finished(self):        if self._matched_case is True and self._fall_through is False:            raise self.StopExecutionclass CSwitch(Switch):    """    CSwitch is a shortcut to call Switch(test_value, fall_through=True)    """    def __init__(self, switch_value):        super(CSwitch, self).__init__(switch_value, fall_through=True)