其他语言中,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
原文地址: http://azaleasays.com/2008/01/20/python-switch/