[Python] 实现Switch Case

Python没有switch语句,只能通过模拟来对应实现:

**方法一:使用dictionary
**values = {
value1: do_some_stuff1,
value2: do_some_stuff2,
...
valueN: do_some_stuffN,
}
values.get(var, do_default_stuff)()

根据需求可以自行更改参数内容,灵活运用

def add(x,y):  
    print x+y  
def minus(x,y):  
    print x-y  
def multiply(x,y):  
    print x*y  
def div(x,y):  
    print x/y  
def fun_case_list(key,arg1,arg2):
    operator = {
    '+':add,
    '-':minus,
    '*':multiply,
    '/':div
    }
    if operator.has_key(key):
        return operator.get(key)(arg1,arg2)
    else:
        return 'No [%s] case in dic'%key #or do other func

if __name__ == "__main__":
    fun_case_list('*',3,5)
    fun_case_list('l',3,4)

或者你可以自己造一个类来实现:

class switch_case(object):
    def case_to_function(self,case,arg1,arg2):
        func_name = 'case_func_'+str(case)
        try:
            method = getattr(self,func_name)
            return method(arg1,arg2)
        except AttributeError:
            return 'No func found in case list,do default action here'
    def case_func_add(self,arg1,arg2):
        temp = arg1 + arg2
        return temp
    def case_func_minus(self,arg1,arg2):
        temp = arg1 - arg2
        return temp
    def case_func_multiply(self,arg1,arg2):
        temp = arg1 * arg2
        return temp
    def case_func_div(self,arg1,arg2):
        temp = arg1 / arg2
        return temp
func = 'minus'
case = switch_case()
print case.case_to_function(func,2,5)


#或者是构造属性去送参数,看个人喜好
class switch_case(object):
    def __init__(self, case, arg1, arg2):
        self.case = str(case)
        self.arg1 = arg1
        self.arg2 = arg2
    def case_to_function(self):
        func_name = 'case_func_'+str(self.case)
        try:
            method = getattr(self,func_name)
            return method()
        except AttributeError:
            return 'No func found in case list,do default action here'
        
    def case_func_add(self):
        temp = self.arg1 + self.arg2
        return temp
    def case_func_minus(self):
        temp = self.arg1 - self.arg2
        return temp
    def case_func_multiply(self):
        temp = self.arg1 * self.arg2
        return temp
    def case_func_div(self):
        temp = self.arg1 / self.arg2
        return temp

func = 'minxus'
case = switch_case(func,2,5)
print case.case_to_function()

方法二:使用lambda

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

方法三:Brian Beck提供了一个类 switch 来实现switch的功能


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

v = 'two'
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

原文地址:https://www.cnblogs.com/xiaoqiangink/p/12978475.html