它是pythonic:命名lambdas

时间:2016-07-14 18:25:18

标签: python lambda

我开始意识到python中lambda表达式的价值,特别是涉及函数式编程时,mapfunctions returning functions等。但是,我也一直在函数中命名lambdas这是因为:

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

当我遇到满足上述标准的情况时,我一直在编写一个名为lambda的表达式,以便干燥并缩小范围功能。例如,我正在编写一个对某些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

3 个答案:

答案 0 :(得分:11)

这不是Pythonic和PEP8 discourages it

  

始终使用def语句而不是赋值语句   将lambda表达式直接绑定到标识符。

     

是:

def f(x): return 2*x
     

没有

f = lambda x: 2*x
     

第一种形式表示生成的函数对象的名称是   特别是'f'而不是通用'<lambda>'。这是更多   通常用于回溯和字符串表示。使用   赋值语句消除了lambda的唯一好处   表达式可以提供一个明确的def语句(即它可以   被嵌入一个更大的表达式中)

这方面的经验法则是考虑definition:lambdas表达式是匿名函数。如果你命名它,它不再是匿名的。 :)

答案 1 :(得分:4)

  

我编写了一个名为lambda的表达式来进行索引而不是编写一个完整的其他函数

好吧,你正在写一个完整的其他功能。你只是用lambda表达式编写它。

为什么不使用def?你可以获得更好的堆栈跟踪和更多的语法灵活性,而且你不会丢失任何东西。它不像def不能出现在另一个函数中:

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

答案 2 :(得分:0)

这些在功能上(没有双关语意)相同。

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

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

如果您对其中一种有美学偏好,请使用它。