-1

在 Python 中,对于一个简单的函数foo(x, y),我知道至少有 3 种方法可以将参数绑定y到某个值

# defining a nested function:
def foobar(x):
  return foo(x, y=yval)

# using lambda
foobar = lambda x: foo(x, y=yval)

# using functools
from functools import partial
foobar = partial(foo, y=yval)

虽然我怀疑上面的列表是否详尽,但我也想知道我应该选择哪一个?它们在性能、安全性和命名空间处理方面都相同吗?还是每种方法都有额外的开销和注意事项?为什么要functools定义partial其他方法何时已经存在?

4

1 回答 1

4

不,它们并不都是等价的——特别是,alambda不能腌制functools.partial,而 IIRC 只能在最近的 Python 版本中腌制(我在文档中找不到哪个确切版本;它在 2.6 中不起作用,但在 3.1 中确实如此)。也不能在其他函数内部定义函数(在 2.6 和 3.1 中都没有)。

' 出现在库中的原因partial是它为您提供了一个明确的习惯用法来部分应用内联函数。定义 ( def) 不能出现在表达式的中间,例如

map(partial(foo, y=yval), xs)

此外,从定义 orlambda来看,目前还不清楚部分应用是怎么回事,因为您可以将任意表达式放在 a 中lambda,并将任意语句放在定义中。

我建议你去,partial除非你有理由不使用它。

[事实上,这份清单并不详尽。想到的第一个选择是可调用对象:

class foobar:
    def __init__(self, yval):
        self.__yval = yval
    def __call__(self, x):
        return foo(x, self.__yval)

但对于这样一个简单的问题,这些都是重量级的。]

于 2012-10-18T16:34:35.763 回答