繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM