[转帖] Python 中 switch 的解决办法

K*K posted @ Thu, 08 Jan 2009 19:25:46 +0800 in 未归类 with tags python switch , 5275 readers

其他语言中,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 

转自:校内论坛

Avatar_small
stellit said:
Jan 13, 2009 12:26:24 PM

还是看着lamda顺眼....

Head_small
K*K said:
Jan 13, 2009 05:39:47 PM

QQ 也开始用 python 啦~ 莫非 java 里也有 lambda ?

用 lambda 处理 switch 好像只能写一行,对付需要多行处理的程序就没办法了。


Login *


loading captcha image...
(type the code from the image)
or Ctrl+Enter