我开始意识到python中lambda表达式的价值,特别是涉及函数式编程时,map
,functions returning functions等。但是,我也一直在函数中命名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
这是滥用python的lambdas吗?我应该把它搞定并定义一个单独的函数吗?
可能值得链接function inside function。
答案 0 :(得分:11)
这不是Pythonic和PEP8 discourages it:
始终使用def语句而不是赋值语句 将lambda表达式直接绑定到标识符。
是:
def f(x): return 2*x
没有
f = lambda x: 2*x
第一种形式表示生成的函数对象的名称是 特别是
'f'
而不是通用'<lambda>'
。这是更多 通常用于回溯和字符串表示。使用 赋值语句消除了lambda的唯一好处 表达式可以提供一个明确的def语句(即它可以 被嵌入一个更大的表达式中)
这方面的经验法则是考虑definition:lambdas表达式是匿名函数。如果你命名它,它不再是匿名的。 :)
答案 1 :(得分:4)
我编写了一个名为lambda的表达式来进行索引而不是编写一个完整的其他函数
好吧,你正在写一个完整的其他功能。你只是用lambda表达式编写它。
为什么不使用def
?你可以获得更好的堆栈跟踪和更多的语法灵活性,而且你不会丢失任何东西。它不像def
不能出现在另一个函数中:
def fcn_operating_on_arrays(array0, array1):
def indexer(a0, a1, idx):
return a0[idx] + a1[idx]
...
答案 2 :(得分:0)
这些在功能上(没有双关语意)相同。
indexer = lambda a0, a1, idx: a0[idx] + a1[idx]
def indexer(a0, a1, idx):
return a0[idx] + a1[idx]
如果您对其中一种有美学偏好,请使用它。