Differences between functools.partial and a similar lambda?
在Python中,假设我有一个函数
这两种方式(如果有的话)之间有什么区别?
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 objects defined in classes behave like static methods and do not transform into bound methods during instance attribute look-up.
如果用于从提供给类的参数(在构造函数中或稍后通过函数)中创建类方法,lambda方法是否会受此影响?
lambda函数与标准函数具有相同的类型,因此它的行为类似于实例方法。
您的示例中的
1 | g1(x, y, z) |
导致这个调用(不是有效的Python语法,但你明白了):
1 | f(*secondary_args, x, y, z, **secondary_kwargs) |
lambda只接受一个参数并使用不同的参数顺序。 (当然这两个差异都可以克服 - 我只是回答你给出的两个版本之间的差异。)
执行
部分不仅比已经说过的等效lambda快约20%,而且它们保持直接参考它们的相关性。在lambdas中,函数在函数体内被"埋葬"。
=>如果你只需要解决延迟评估一个函数的问题,直到知道了所有的args,那么就使用partials。与将调用埋入匿名函数(即lambdas)相比,您将拥有更好的内省方法。
是的,
但是在类定义中使用这样的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') |