根据lambda表达式定义命名函数和使用`def`之间是否存在差异?

时间:2017-09-06 17:15:04

标签: python python-3.x

根据lambda表达式定义命名函数和使用def

之间是否存在差异?

例如,以下两种方式定义两个等效函数吗?

adder = lambda x, y: x+y

def adder(x,y):
    return x+y

感谢。

4 个答案:

答案 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)]