Python 根据lambda表达式定义命名函数和使用'def'之间有区别吗?
根据lambda表达式定义命名函数与使用Python 根据lambda表达式定义命名函数和使用'def'之间有区别吗?,python,python-3.x,Python,Python 3.x,根据lambda表达式定义命名函数与使用def之间是否有区别 例如,以下两种方法是否定义了两个等效函数 adder = lambda x, y: x+y 及 谢谢。除了有一个便于打印的名称外,在该示例中没有。不过,一般来说,最大的区别是lambda中不能有语句(不适用于您的示例,但值得知道) 例如: def foo(): x = 2 #can't do in lambda return x 在结构上它们是等价的。但是,来自: 始终使用def语句,而不是 将lambda表达式直
def
之间是否有区别
例如,以下两种方法是否定义了两个等效函数
adder = lambda x, y: x+y
及
谢谢。除了有一个便于打印的名称外,在该示例中没有。不过,一般来说,最大的区别是lambda中不能有语句(不适用于您的示例,但值得知道) 例如:
def foo():
x = 2 #can't do in lambda
return x
在结构上它们是等价的。但是,来自: 始终使用
def
语句,而不是
将lambda表达式直接绑定到标识符
是:def(x):返回2*x
否:f=lambda x:2*x
第一种形式表示结果函数对象的名称为
特别是“f”而不是通用的“lambda”。这是更多
通常用于回溯和字符串表示。用途
转让声明中的条款消除了lambda的唯一利益
表达式可以在显式def语句上提供(即它可以
嵌入到更大的表达式中
因此,这意味着您应该只使用嵌入在较大表达式中的lambda,以便代码更简洁,而不是为它们指定一个对象,因为美观整洁的好处被上述缺点所压倒。长话短说,没有区别。唯一的小区别是没有特定的名称em嵌入函数对象。这使得一些工具,例如Python内置的
多处理
与lambda函数不兼容(在多处理
的情况下,这是由于pickle
无法序列化lambda),尽管类似的包多进程确实支持它们。有一点不同
下面是一个例子:
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)]
可能的重复有点误导。这本身并没有什么区别,因为在def
函数中也会犯同样的错误。这个“问题”只与Python使用符号名称绑定这一事实有关(对于def
和lambda
函数也是如此)@EliKorvigo确实如此,但使用lambdas实现这一点要容易得多,也不太明显。
def create_multipliers_closure():
def multiplier(x):
return i * x
return [multiplier for i in range(5)]