用于延期函数评估的Lambda或functools.partial?

时间:2014-09-13 09:33:49

标签: python lambda deferred-loading

假设我们有一个基本功能:

def basic(arg):
    print arg

我们需要在另一个函数中推迟对此函数的求值。我正在考虑两种可能的方式:

  1. 使用lambdas:

    def another(arg):
        return lambda: basic(arg)
    
  2. 使用functools.partial

    from functools import partial
        def another(arg):
            return partial(basic, arg)
    
  3. 哪种方法更受欢迎?为什么?还有另一种方法吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

我认为这主要取决于个人品味,但functools.partial is believed要比同等lambda快一些。我更喜欢在这种情况下使用functools.partial,因为在我看来,表明我们正在处理一个简单的部分函数应用而不是一个完整的闭包是有道理的。