它是pythonic:命名lambdas
我开始欣赏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的滥用吗?我应该吸收它并定义一个单独的功能吗?
-
这不是Pythonic,PEP8不建议这样做:
始终使用def语句而不是将lambda表达式直接绑定到标识符的赋值语句。
是:
def f(x): return 2*x
没有:
f = lambda x: 2*x
第一种形式意味着结果函数对象的名称专门
'f'
代替了generic
'<lambda>'
。通常,这对于回溯和字符串表示形式更为有用。使用赋值语句消除了lambda表达式可以提供的优于显式def语句的唯一好处(即,它可以嵌入较大的表达式中)经验法则是考虑其定义:lambdas表达式是匿名函数。如果您命名,它将不再是匿名的。:)