2016-01-21 25 views
-5

我只是在与一些代码作斗争,并且需要您的帮助!Python 2.7.10:在DICT中使用LAMBDA和LOGICAL运算符来选择一个案例

目的:

  • 不使用IF语句
  • 选择的情况下,做一些根据情况
  • 没有Python的开关,因为Python的2.7.10使用!

这里是还未起作用代码 - >取决于值NBINS它应该选择某种功能或直接做一个计算(例如lambda x: x==nbins: bucket-=1

def caseSwitcherCheckBucket(bucket): 

     choose = { 
      lambda x: x==nbins: maxBucket, 
      lambda x: x<nbins: defaultBucket, 
      } 

     func = choose.get(bucket) 
     return func() 


    def defaultBucket(bucket): 
     print 'defaultBucket():', bucket 
     return bucket 

    def maxBucket(bucket):   
     bucket-=1 
     print 'maxBucket():', bucket 
     return bucket 

我发现这个范例:Python dictionary instead of switch/case并想要做戴夫韦伯提出的建议。在这里他的代码:

values = { 
    lambda x: x < 4: foo, 
    lambda x: x > 4: bar 
} 

不幸的是,它在这种情况下不起作用! 我该如何解决这个问题?

+++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++

通常我使用这种“CaseSwitcher” - >这里是一个例子!

def caseSwitcherCheckLogStatus(check_log_status): 

     choose = { 
      True: entLog,    
      False: doNothing, 
      } 

     func = choose.get(check_log_status) 
     return func() 

    def entLog(): 
     data[i,[0,1,2]] = 10**(data[i,[0,1,2]]) 

    def doNothing(): 
     pass 

+++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++

如果您对我如何改进我的“CaseSwitcher”一般情况有所了解,我也很乐意得到一些建议。

+0

Python中的任何版本有一个switch语句,并没有,也绝不会是一个版本2.10。 – chepner

+0

http://stackoverflow.com/help/mcve –

+0

对不起,我有一个错字 - >我正在使用2.7.10!而且,好的,我明白这个错误,我认为Python 3.0有一个。我是这个领域的新手。 – firefly2517

回答

0

您可以实现这样的:

def switcher(cases, default_func=None): 
    def switch(value): 
     for case_func, result in cases: 
      if case_func(value): 
       return result(value) 

     if default_func is not None: 
      return default_func(value) 
     else: 
      raise RuntimeError("No case matched and no default given") 

    return switch 

可用作

my_switch = switcher([ 
    (lambda value: value == nBins, maxBucket), 
    (lambda value: value < nBins, defaultBucket), 
]) 

my_switch(val) 
+0

由于提问者在评论中提到了性能,我必须指出,这将比相当于'if:else:'结构,因为它需要额外的函数调用。 –

+0

这是非常有保证的,是的:) – filmor

+0

@filmor:感谢您的帮助,但我会需要最快的方式。我问了这个问题,因为我想测试一下我的程序是否更快地不使用IF语句。 – firefly2517