Python:我可以使用初始化程序部分应用reduce吗?

时间:2018-04-09 02:11:13

标签: python functional-programming reduce partial-application functools

initializer位于iterable之后。这会导致部分应用的问题。考虑这些(微不足道的)例子:

In [1]: from functools import reduce, partial

In [2]: f = partial(reduce, lambda a,b: a+b, 100)

In [3]: f([1,2,3])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-816cce84b257> in <module>()
----> 1 f([1,2,3])

TypeError: reduce() arg 2 must support iteration

In [4]: f = partial(reduce, lambda a,b: a+b, initializer=100)

In [5]: f([1,2,3])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-816cce84b257> in <module>()
----> 1 f([1,2,3])

TypeError: reduce() takes no keyword arguments

是否有一些技巧可以解决这个问题?

2 个答案:

答案 0 :(得分:1)

只需更改参数的顺序:

>>> f = partial(lambda func, init, iterable: reduce(func, iterable, init), 
                lambda a,b: a+b, 100)
>>> f([1,2,3])
106

答案 1 :(得分:0)

马拉特给了一个很好的解决方案。为了好玩,我写了foldl并翻转了参数。我很好奇这将如何比较性能方面与使用lambda来翻转像Marat那样的论点。

def foldl(f: Callable, acc: Any, xs: Iterable) -> Any:
    if not xs:
        return acc
    return foldl(f, f(acc, xs[0]), xs[1:])