Python:理解reduce()函数中的'initializer'参数

5

我对Python还比较陌生,遇到了一些麻烦,
涉及折叠或者更具体的说是reduce()函数中的“initializer”参数。

例如:reduce(function, iterable[, initializer])

这里是函数...

>>> def x100y(x,y):
...     return x*100+y

有人能解释一下为什么 reduce() 会产生44…的结果吗?

>>> reduce(x100y, (), 44)
44

或者为什么这里会产生30102错误...
>>> reduce(x100y, [1,2], 3)
30102

1
和 @TimPeters 一样的问题。此外,您是否阅读过 这个?特别是在“大致等同于:”之后显示的代码?按照您的参数值逐行跟踪该代码,那应该可以解释您观察到的行为。 - crayzeewulf
1
谷歌搜索显示x100y来自http://infohost.nmt.edu/tcc/help/pubs/python/web/reduce-function.html。 - Alok--
1个回答

7

根据文档:

reduce(function, iterable[, initializer])

从左到右将可迭代对象中的元素累加应用于二元函数,以此将可迭代对象减少为单个值。例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 计算出 ((((1+2)+3)+4)+5)。左参数 x 是累加值,右参数 y 是来自可迭代对象的更新值。如果提供了可选的初始化值,则将其置于可迭代对象的元素之前进行计算,并在可迭代对象为空时作为默认值。如果未提供初始化值并且可迭代对象只包含一个元素,则返回第一个元素。

初始化器被放置在您的可迭代对象中的元素 0 的位置,如果可迭代对象中没有元素,则返回它。(这就是为什么您得到了 44)

此外,x100y 不是一个有效的 Python 函数。如果要使它成为有效的 Python 函数,您需要执行以下操作:

reduce(lambda x,y: x*100*y,[1,2],3)

这相当于

(3*100*1)*100*2,应该得到60000(你得到的值可能是由于错误导致的)

有关lambda的文档在这里


谢谢您。我已经阅读了文档,但是您的解释更加清晰明了。再次确认一下:如果只提供一个参数**(例如 reduce(x100y, [15]) 或 reduce(x100y, (), 44))**,那么 reduce() 不会运行,而是返回提供的数字? - user2856497
@KevinZerbo 请再读一遍:初始化程序将在任何情况下都会影响计算。它不过是累加器的起始值,既不多也不少。 - Ingo
2
@KevinZerbo 你说得对。所以基本上 reduce(x100y,[15]) 等同于 reduce(x100y,[], 15)。由于可迭代对象中没有足够的元素来完成函数 x100y,它只返回 15 而不是将其通过函数运行。 - vicg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接