3

I'm relatively new to Python and am having trouble
with Folds or more specifically, reduce()'s 'initializer' argument

e.g. reduce(function, iterable[, initializer])

Here is the function...

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

Could someone explain why reduce() produces 44...

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

or why it produces 30102 here...

>>> reduce(x100y, [1,2], 3)
30102
4

1 回答 1

7

从文档:

减少(函数,可迭代[,初始化器])

将两个参数的函数从左到右累积应用于iterable的项目,以将iterable减少为单个值。例如, 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 的文档在这里

于 2013-10-07T23:55:09.890 回答