我认为functools.reduce(function, iterable[, initializer]) 的文档可读性很强。执行迭代,将操作从左到右应用于连续元素,并将结果累加到左操作数中。为了确定有问题的方面,创建上述代码的变体会有所帮助。
在下面的例子中,我们得到元素的总和;我们看到在工作中没有隐含的 1 作为“默认”值:
>>> print(reduce(lambda x, y: x + y, [2,3]))
5
如果 iterable 中没有剩余元素,则归约停止:
>>> print(reduce(lambda x, y: x + y, [1]))
1
如果根本没有元素,则减少失败:
>>> print(reduce(lambda x, y: x + y, []))
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
print(reduce(lambda x, y: x + y, []))
TypeError: reduce() of empty sequence with no initial value
可选的initializer 值用于启动缩减(如果没有元素则立即停止):
>>> print(reduce(lambda x, y: x + y, [], 0))
0
所以x 确实是在进入可迭代对象之前使用可选的initializer 值初始化的累加器。 y 是可迭代的下一个值,如果没有元素(左),function 将被忽略。
这里再举一个例子来更好地理解x和y的作用:
>>> print(reduce(lambda x, y: x - y, [1,2,3], 10))
4
在单步模式下,上面的缩减如下所示:
x = 10 # initializer
y = 1 # from iterable
x = x-y # x==9
y = 2 # from iterable
x = x-y # x==7
y = 3 # from iterable
x = x-y # x==4
4 # result