2016-07-14 67 views
3

我开始欣赏lambda表达式在Python中的价值,特别是当涉及到函数式编程,mapfunctions returning functions等等。但是,我也一直在函数内命名lambda,因为:pythonic是否pythonic:命名lambdas

  • 我需要几次相同的功能并且不想重复代码。
  • 该功能是特定于它出现的功能;其他地方不需要。

当我遇到满足上述条件的情况时,我一直在编写一个命名的lambda表达式,以实现DRY和狭义范围的功能。例如,我正在编写一个可以在一些numpy数组上运行的函数,并且我需要对传递给该函数的所有数组进行适度繁琐的索引(这可以轻松地放在一行中)。我写了一个名为lambda表达式的索引,而不是在整个函数定义中编写整个其他函数或复制/粘贴索引。

def fcn_operating_on_arrays(array0, array1): 
    indexer = lambda a0, a1, idx: a0[idx] + a1[idx] 

    # codecodecode 

    indexed = indexer(array0, array1, indices) 

    # codecodecode in which other arrays are created and require `indexer` 

    return the_answer 

这是滥用python的lambdas吗?我应该把它吸起来并定义一个单独的函数吗?

编辑

也许值得链接function inside function

+1

不,它不是Python的。根据定义,lambda是匿名函数,用于简化函数作为参数的使用(就像在'sort()'中),你可以命名它,但你最好使用已知的'def',这更容易理解。 – Delgan

回答

6

这不符合Python和PEP8 discourages it

始终使用DEF语句,而不是一个赋值语句 直接绑定lambda表达式的一个标识符。

是:

def f(x): return 2*x 

号:

f = lambda x: 2*x 

第一种形式是指所得到的功能对象的名称是 具体'f'代替通用'<lambda>'。一般而言,这对于回溯和字符串表示更有用。赋值语句的使用 消除的唯一好处在一个lambda表达式 能提供明确的高清声明(即它可以 被嵌入一个更大的表达式中)

1

这些功能(无双关语意思)相同。

indexer = lambda a0, a1, idx: a0[idx] + a1[idx] 

def indexer(a0, a1, idx): 
    return a0[idx] + a1[idx] 

如果您对其中一个或另一个有美学偏好,那就使用它。

4

我写了一个名为lambda表达式做的,而不是写一个整体的其他功能

好索引,你写一个整体的其他功能。你只是用一个lambda表达式来写它。

为什么不使用def?你会得到更好的堆栈跟踪和更多的语法灵活性,而且你不会失去任何东西。它不象def不能在另一个函数内部发生:

def fcn_operating_on_arrays(array0, array1): 
    def indexer(a0, a1, idx): 
     return a0[idx] + a1[idx] 
    ... 
+0

pythonic是如何在另一个函数中“def”的?每当我看到有人这样做,他们都在滥用它。 –

+0

@ joshua.r.smith:在另一个函数中放置一个'def'完全没问题。人们在装饰者或其他需要封闭的情况下都会一直这样做。我个人更喜欢在内部函数不使用任何闭包变量时避免它,因为能够访问函数以进行测试或交互式使用很方便。 – user2357112

+1

这就是装饰者的工作原理,所以我会说“很”。 –