我开始欣赏lambda表达式在python中的价值,尤其是在函数编程map,函数返回函数等方面。但是,我也一直在函数中命名lambda,因为:
map
当遇到满足以上条件的情况时,我一直在编写一个命名的lambda表达式,以进行DRY和狭义范围功能。例如,我正在编写一个在某些numpy数组上运行的函数,并且我需要对传递给该函数的所有数组进行适度繁琐的索引编制(可以很容易地放在一行上)。我编写了一个名为lambda表达式来进行索引编制,而不是编写整个其他函数或在整个函数定义中多次复制/粘贴索引。
numpy
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语句的唯一好处(即,它可以嵌入较大的表达式中)
始终使用def语句而不是将lambda表达式直接绑定到标识符的赋值语句。
是:
def f(x): return 2*x
没有:
f = lambda x: 2*x
第一种形式意味着结果函数对象的名称专门'f'代替了generic '<lambda>'。通常,这对于回溯和字符串表示形式更为有用。使用赋值语句消除了lambda表达式可以提供的优于显式def语句的唯一好处(即,它可以嵌入较大的表达式中)
'f'
'<lambda>'
经验法则是考虑其定义:lambdas表达式是匿名函数。如果您命名,它将不再是匿名的。:)