Reduce函数不处理空列表

时间:2015-11-26 19:34:13

标签: python list lambda reduce

我之前创建了一个递归函数来查找列表的产品。 现在我创建了相同的函数,但使用了reduce函数和lamdba

当我运行此代码时,我得到了正确答案。

items = [1, 2, 3, 4, 10]
print(reduce(lambda x, y: x*y, items))

但是,当我给出一个空列表时,会出现错误 - reduce() of empty sequence with no initial value。这是为什么?

当我创建递归函数时,我创建了处理空列表的代码,reduce函数的问题只是它不是为了处理和清空列表而设计的吗?或者还有其他原因吗?

我似乎无法在网上找到问题或任何解释原因的问题,我只能找到解决该特定问题的问题,不能解释。

2 个答案:

答案 0 :(得分:12)

正如documentation

所写
  

如果存在可选的初始值设定项,则它将放置在计算中的iterable项之前,并在iterable为空时用作默认值。如果没有给出初始值设定项且迭代只包含一个项目,则返回第一个项目。

因此,如果您希望代码使用空列表,则应使用初始化程序:

>>> reduce(lambda x, y: x*y, [], 1)
1

答案 1 :(得分:5)

reduce()需要初始值才能从中开始操作。如果序列中没有值且没有显式值,那么它就无法开始操作,也没有有效的返回值。指定显式初始值,以允许它以空序列运行:

print (reduce(lambda x, y: x*y, items, 1))