Lambda或functools.用于延迟函数求值的部分



假设我们有一个基本函数:

def basic(arg):
    print arg

我们需要把对这个函数的评估推迟到另一个函数中。我正在考虑两种可能的方式:

  1. 使用lambdas:

    def another(arg):
        return lambda: basic(arg)
    
  2. 使用函数工具.部分

    from functools import partial
        def another(arg):
            return partial(basic, arg)
    

以下哪种方法是首选的,为什么?有其他方法吗?

Lambdas不存储不在其参数中的数据。这可能会导致奇怪的行为:

def lambdas(*args):
    for arg in args:
        yield lambda: str(arg)
one, two, three, four = lambdas(1, 2, 3, 4)
print one(), two(), three(), four()

预期输出

1 2 3 4

输出

4 4 4 4

之所以会发生这种情况,是因为lambda没有存储arg值,并且它遍历了args的所有元素,所以现在arg总是4

首选的方法是使用functools.partial,强制存储参数:

from functools import partial
def partials(*args):
    for arg in args:
        yield partial(str, arg)
one, two, three, four = partials(1, 2, 3, 4)
print one(), two(), three(), four()

预期输出

1 2 3 4

输出

1 2 3 4

我相信这主要取决于个人品味,尽管functools.partial被认为比同等的lambda快一些。我更喜欢在这种情况下使用functools.partial,因为在我看来,表明我们处理的是一个简单的部分函数应用程序,而不是一个全面的闭包是有意义的。

最新更新