【问题标题】:Lambda or functools.partial for deferred function evaluation? [duplicate]用于延迟函数评估的 Lambda 或 functools.partial? [复制]
【发布时间】:2014-09-13 09:33:49
【问题描述】:

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

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)
    

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

【问题讨论】:

  • 我假设你的意思是部分(基本,arg)?
  • 没错,我的错。

标签: python lambda deferred-loading


【解决方案1】:

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

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

【讨论】:

  • 一般来说,您对 Python 的 lambdas 的后期绑定性质提出的担忧是有效的,尽管我认为它们并不完全适用于特定用例(延迟函数评估) 由这个问题提出。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2016-08-14
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多