关于python:functools.partial和类似的lambda之间的区别?

Differences between functools.partial and a similar lambda?

在Python中,假设我有一个函数f,我希望传递一些辅助参数(为简单起见,它只是第一个保持变量的参数)。

这两种方式(如果有的话)之间有什么区别?

1
2
3
4
5
6
# Assume secondary_args and secondary_kwargs have been defined

import functools

g1 = functools.partial(f, *secondary_args, **secondary_kwargs)
g2 = lambda x: f(x, *secondary_args, **secondary_kwargs)

例如,在partial的doc页面中,有这样的引用:

partial objects defined in classes behave like static methods and do not transform into bound methods during instance attribute look-up.

如果用于从提供给类的参数(在构造函数中或稍后通过函数)中创建类方法,lambda方法是否会受此影响?


  • lambda函数与标准函数具有相同的类型,因此它的行为类似于实例方法。

  • 您的示例中的partial对象可以像这样调用:

    1
    g1(x, y, z)

    导致这个调用(不是有效的Python语法,但你明白了):

    1
    f(*secondary_args, x, y, z, **secondary_kwargs)

    lambda只接受一个参数并使用不同的参数顺序。 (当然这两个差异都可以克服 - 我只是回答你给出的两个版本之间的差异。)

  • 执行partial对象比执行等效的lambda稍快。


  • 部分不仅比已经说过的等效lambda快约20%,而且它们保持直接参考它们的相关性。在lambdas中,函数在函数体内被"埋葬"。

    =>如果你只需要解决延迟评估一个函数的问题,直到知道了所有的args,那么就使用partials。与将调用埋入匿名函数(即lambdas)相比,您将拥有更好的内省方法。


    是的,lambda将"受此影响"。 partial没有这个问题,因为它是一个调用运算符重载的对象,而不是一个真正的函数。

    但是在类定义中使用这样的lambda只是误用。


    我相信类方法只适用于在类定义期间分配的函数。稍后分配的功能不会被特别处理。

    除此之外,我个人赞成lambdas,因为它们更常见,因此使代码更容易理解。

    1
    2
    3
    4
    5
    class Foo(object):
        def __init__(self, base):
            self.int = lambda x:int(x, base)

    print Foo(4).int('11')