它是pythonic:命名lambdas

jos*_*ith 9 python lambda

我开始意识到python中lambda表达式的价值,特别是涉及函数式编程map,函数返回函数等等.但是,我也一直在函数中命名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
Run Code Online (Sandbox Code Playgroud)

这是滥用python的lambdas吗?我应该吮吸它并定义一个单独的功能吗?

编辑

可能值得链接功能内部功能.

Del*_*gan 15

这不是Pythonic,PEP8不鼓励它:

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

是:

def f(x): return 2*x
Run Code Online (Sandbox Code Playgroud)

没有:

f = lambda x: 2*x
Run Code Online (Sandbox Code Playgroud)

第一种形式意味着生成的函数对象的名称具体'f'而不是泛型'<lambda>'.这对于一般的回溯和字符串表示更有用.使用赋值语句消除了lambda表达式可以在显式def语句上提供的唯一好处(即它可以嵌入到更大的表达式中)

对此的经验法则是考虑其定义:lambdas表达式是匿名函数.如果你命名它,它不再是匿名的.:)


use*_*ica 5

我编写了一个名为lambda表达式来做索引,而不是编写其他函数

好吧,您正在编写其他功能。您只是用lambda表达式编写它。

为什么不使用def?您可以获得更好的堆栈跟踪和语法上的灵活性,并且不会丢失任何内容。并不是def不可能在另一个函数中发生:

def fcn_operating_on_arrays(array0, array1):
    def indexer(a0, a1, idx):
        return a0[idx] + a1[idx]
    ...
Run Code Online (Sandbox Code Playgroud)

  • @joshua.r.smith:将“def”放入另一个函数中是完全可以的。当人们想要关闭时,人们总是对装饰器或其他情况这样做。我个人更喜欢在内部函数不使用任何闭包变量时避免它,因为能够方便地访问该函数以进行测试或交互使用。 (3认同)
  • 另一个函数中的“def”有多Pythonic?每当我看到有人这样做时,他们都是在滥用它。 (2认同)