一尘不染

它是pythonic:命名lambdas

python

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

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

当遇到满足以上条件的情况时,我一直在编写一个命名的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的lambda的滥用吗?我应该吸收它并定义一个单独的功能吗?


阅读 179

收藏
2020-12-20

共1个答案

一尘不染

这不是Pythonic,PEP8不建议这样做

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

是:

def f(x): return 2*x

没有:

f = lambda x: 2*x

第一种形式意味着结果函数对象的名称专门'f'代替了generic
'<lambda>'。通常,这对于回溯和字符串表示形式更为有用。使用赋值语句消除了lambda表达式可以提供的优于显式def语句的唯一好处(即,它可以嵌入较大的表达式中)

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

2020-12-20