zoukankan      html  css  js  c++  java
  • [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
    
    
  • 相关阅读:
    计算机基础知识
    markdown简介及基本语法
    session和cookie的区别
    MySQL的游标
    数据库单表查询
    外键(有无级联)
    mysql
    数据库引擎
    守护进程和守护线程的区别
    快排等
  • 原文地址:https://www.cnblogs.com/xiaoqiangink/p/12978475.html
Copyright © 2011-2022 走看看