它是pythonic:命名lambdas吗

它是pythonic:命名lambdas吗,python,lambda,Python,Lambda,我开始欣赏python中lambda表达式的价值,尤其是在函数编程方面,map等。不过,我也一直在函数中命名lambda,因为: 我多次需要相同的功能,不想重复代码 该功能特定于其出现的功能;其他地方不需要它 当我遇到满足上述条件的情况时,我一直在编写一个命名的lambda表达式,以干燥和缩小功能范围。例如,我正在编写一个在一些numpy数组上运行的函数,我需要对传递给该函数的所有数组(可以很容易地放在一行上)进行一些相当繁琐的索引。我编写了一个命名的lambda表达式来进行索引,而不是编写

我开始欣赏python中lambda表达式的价值,尤其是在函数编程方面,
map
等。不过,我也一直在函数中命名lambda,因为:

  • 我多次需要相同的功能,不想重复代码
  • 该功能特定于其出现的功能;其他地方不需要它
当我遇到满足上述条件的情况时,我一直在编写一个命名的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的滥用吗?我应该接受它并定义一个单独的函数吗

编辑 可能值得链接。

它们在功能上(没有双关语)完全相同

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

def indexer(a0, a1, idx):
    return a0[idx] + a1[idx]
如果你对其中一个有审美偏好,那么就使用它

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

那么,您正在编写一个完整的其他函数。你只是用一个lambda表达式写的

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

def fcn_operating_on_arrays(array0, array1):
    def indexer(a0, a1, idx):
        return a0[idx] + a1[idx]
    ...
这不是Pythonic,而是:

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

是的:

def f(x): return 2*x
否:

f = lambda x: 2*x
第一种形式表示结果函数对象的名称为 特别是
'f'
而不是泛型
'
。这是更多 通常用于回溯和字符串表示。用途 转让声明中的条款消除了lambda的唯一利益 表达式可以在显式def语句上提供(即它可以 嵌入到更大的表达式中)


这方面的一条经验法则是:lambdas表达式是匿名函数。如果你说出它的名字,它就不再是匿名的了。:)

不,它不是蟒蛇。根据定义,lambda是匿名函数,例如用于简化函数作为参数的用法(如在
sort()
中),您可以命名它,但最好使用更容易理解的已知
def
。在另一个函数中,
def
的pythonic有多大?每当我看到有人这样做时,他们就是在滥用它。@joshua.r.smith:在另一个函数中放入
def
是非常好的。当人们想要结束的时候,他们总是为装饰师或其他案件这样做。我个人更喜欢在内部函数不使用任何闭包变量时避免它,因为能够访问函数进行测试或交互使用很方便。