根据lambda表达式定义命名函数和使用def
?
例如,以下两种方式定义两个等效函数吗?
adder = lambda x, y: x+y
和
def adder(x,y):
return x+y
感谢。
答案 0 :(得分:3)
在结构上它们是等价的。但是,来自PEP 8:
始终使用
def
语句而不是赋值语句 将lambda表达式直接绑定到标识符。是:
def f(x): return 2*x
否:
f = lambda x: 2*x
第一种形式表示生成的函数对象的名称是 特别是'f'而不是通用'lambda'。这是更多 通常用于回溯和字符串表示。使用 赋值语句消除了lambda的唯一好处 表达式可以提供一个明确的def语句(即它可以 嵌入更大的表达式
所以,这意味着你应该只使用嵌入在较大表达式中的lambdas,为了更简洁的代码,而不是为它们分配一个对象,其中美学整洁的好处被上面提到的缺点所压倒。
答案 1 :(得分:2)
除了具有便于打印的名称之外,在该示例中没有。一般来说,一个很大的区别是,你不能在lambda中包含语句(不适用于你的例子,但值得了解)。
例如:
def foo():
x = 2 #can't do in lambda
return x
答案 2 :(得分:1)
长话短说,没有区别。唯一的细微差别是缺少嵌入到函数对象中的特定名称。这使得一些工具,例如Python的内置multiprocessing
与lambda函数不兼容(在multiprocessing
的情况下,它是由于pickle
无法序列化lambda),尽管类似的包multiprocess
确实支持它们。
答案 3 :(得分:1)
有区别。 Lambdas make it much easier to produce closures which may behave in an unexpected way.
以下是一个例子:
def create_multipliers_fun():
def multiplier_factory(i):
def multiplier(x):
return i * x
return multiplier
# here, an array of functions is returned
# each multiplies the input value by the value `i` received in the loop
return [multiplier_factory(i) for i in range(5)]
# prints 0 2 4 6 8
for multiplier in create_multipliers_fun():
print multiplier(2)
def create_multipliers_lambda():
# here, all returned functions use the latest available version
# of the variable `i` (closure with late binding)
return [lambda x : i * x for i in range(5)]
# prints 8 8 8 8 8
for multiplier in create_multipliers_lambda():
print multiplier(2)
使用lambdas,你处理一个后期绑定闭包更不明显。
进行比较:
def create_multipliers_closure():
def multiplier(x):
return i * x
return [multiplier for i in range(5)]