Python:了解 reduce() 的“初始化程序”参数

use*_*497 3 python reduce functional-programming fold higher-order-functions

我对 Python 比较陌生,并且在
使用Folds或更具体地说reduce()是“初始化程序”参数时遇到了问题

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

这里是功能...

>>> def x100y(x,y):
...     return x*100+y
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么 reduce() 产生 44 ...

>>> reduce(x100y, (), 44)
44
Run Code Online (Sandbox Code Playgroud)

或者为什么它在这里产生 30102 ......

>>> reduce(x100y, [1,2], 3)
30102
Run Code Online (Sandbox Code Playgroud)

vic*_*icg 7

从文档:

减少(功能,可迭代[,初始化程序])

将两个参数的函数从左到右累加到iterable的项上,从而将iterable减少到单个值。例如, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])计算 ((((1+2)+3)+4)+5)。左参数 x 是累积值,右参数 y 是可迭代对象的更新值。如果存在可选的初始化器,它在计算中放在可迭代项的前面,并在可迭代项为空时作为默认值。如果没有给出初始化程序并且 iterable 只包含一个项目,则返回第一个项目。

初始值设定项在您的可迭代对象中作为元素 0 放置,如果您的可迭代对象中没有元素,则返回它。(所以这就是你得到 44 的原因)

此外,x100y 不是有效的 Python 函数。如果你想把它变成一个有效的 python 函数,你必须这样做

reduce(lambda x,y: x*100*y,[1,2],3)
Run Code Online (Sandbox Code Playgroud)

这相当于

(3*100*1)*100*2 应该给出 60000(为什么你得到你所拥有的值可能是因为错误)

关于 lambda 的文档在这里

  • @KevinZerbo 你是对的。所以基本上reduce(x100y,[15])相当于reduce(x100y,[],15)。由于迭代中没有足够的元素来完成函数 x100y,它只返回 15 而不是通过函数运行它。 (2认同)