关于python:Lambda或functools.partial进行延期函数评估?

Lambda or functools.partial for deferred function evaluation?

本问题已经有最佳答案,请猛点这里访问。

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

1
2
def basic(arg):
    print arg

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

  • 使用lambdas:

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

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


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

    1
    2
    3
    4
    5
    6
    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
    1 2 3 4

    产量

    1
    4 4 4 4

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    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
    1 2 3 4

    产量

    1
    1 2 3 4


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