functools.partial和类似的拉姆达之间的差异?(Differences between

2019-06-26 18:55发布

在Python中,假设我有一个函数f ,我想通过周围有一些次生的参数(假设为简单起见,它只是保持变量的第一个参数)。

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

# 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 ,例如,有这样的话:

partial类中定义的对象表现得像静态方法和实例期间不转换成绑定方法属性查找。

如果将用于制造从参数类方法提供给类(无论是在构造函数或通过函数以后)的λ-方法从这个苦?

Answer 1:

  1. 一个lambda函数具有相同的类型为标准的功能,所以它会像一个实例方法。

  2. partial在您的例子中的物体可以被称为是这样的:

     g1(x, y, z) 

    导致这种呼叫(而不是有效的Python语法,但你的想法):

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

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

  3. 所述的执行partial对象比等效的执行稍快lambda



Answer 2:

我相信,类方法的东西只适用于类定义时分配的功能。 后来分配的功能都没有经过特殊处理。

除此之外,我个人偏爱lambda表达式因为他们是比较常见的,因此使代码更容易理解。

class Foo(object):
    def __init__(self, base):
        self.int = lambda x:int(x, base)

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


Answer 3:

没错, lambda从这个“苦”。 partial是因为它是重载的调用操作,而不是一个真正的函数的对象不存在这个问题。

但是,在一个类定义使用这样的拉姆达只是滥用。



Answer 4:

谐音并不比同等lambda表达式前面已经说了快只有约20%,但他们保持直接的裁判它们的功能涉及到。 虽然lambda表达式该函数的函数体中“埋葬”。

=>如果您只需要解决,直到所有ARG游戏已知,那么使用谐音defering一个功能评价的问题。 你必须比埋葬调用到匿名函数,即lambda表达式的方式更好内省的方法。



文章来源: Differences between functools.partial and a similar lambda?