![](/img/trans.png)
[英]Is there any difference between using lambda as a function and using lambda with map?
[英]Are there difference between defining a named function in terms of lambda expressions and using `def`?
根据lambda表达式定义命名函数和使用def
有区别吗?
例如,以下两种方式定义两个等效函数?
adder = lambda x, y: x+y
和
def adder(x,y):
return x+y
谢谢。
在结构上它们是等价的。 但是,从PEP 8 :
始终使用
def
语句而不是将lambda表达式直接绑定到标识符的赋值语句。是:
def f(x): return 2*x
否:
f = lambda x: 2*x
第一种形式意味着生成的函数对象的名称特别是'f'而不是通用的'lambda'。 这对于一般的回溯和字符串表示更有用。 赋值语句的使用消除了lambda表达式在显式def语句上提供的唯一好处(即它可以嵌入到更大的表达式中
因此,这意味着你应该只使用嵌入在较大表达式中的lambdas,为了更简洁的代码,而不是为它们分配一个对象,其中美学整洁的好处被上面提到的缺点所淹没。
除了具有便于打印的名称之外,在该示例中没有。 一般来说,一个很大的区别是,你不能在lambda中包含语句(不适用于你的例子,但值得了解)。
例如:
def foo():
x = 2 #can't do in lambda
return x
长话短说,没有区别。 唯一的细微差别是缺少嵌入到函数对象中的特定名称。 这使得一些工具,例如Python的内置multiprocessing
与lambda函数不兼容(在multiprocessing
情况下,它是由于pickle
无法序列化lambda),尽管类似的包multiprocess
确实支持它们。
它们是有区别的。 Lambdas可以更容易地生成可能以意想不到的方式运行的闭包。
这是一个例子:
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)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.