Python 根据lambda表达式定义命名函数和使用'def'之间有区别吗?

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表达式直

根据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)]