1

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

def basic(arg):
    print arg

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

  1. 使用 lambda:

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

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

这些方法中的哪一种是首选,为什么?还有另一种方法吗?

4

2 回答 2

5

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,所以 nowarg始终是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
于 2014-09-13T09:57:17.193 回答
1

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

于 2014-09-13T09:57:20.007 回答