Reduce函数无法处理空列表。

7

之前我创建了一个递归函数来找到列表的乘积。 现在我创建了相同的函数,但是使用了reduce函数和lambda

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

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

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

当我创建递归函数时,我编写了处理空列表的代码,那么问题在于reduce函数是否设计用于处理空列表?还是有其他原因?

我似乎找不到任何关于这个问题的解释或在线问题,只能找到针对特定人员问题的解决方案,没有解释。

2个回答

21

正如在文档中所写:

如果存在可选的初始化值,则它会被放置在可迭代对象的项目之前进行计算,并在可迭代对象为空时作为默认值。如果未给出初始化值且可迭代对象仅包含一个项目,则返回第一个项目。

因此,如果您希望您的代码能够处理空列表,您应该使用初始化值:

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

啊,好的,我有点困惑,因为我找到一个reduce的代码示例,它接受了参数(函数,可迭代对象,初始化值)。我以为列表在某种程度上被用作了初始化值,但感谢您澄清! - Chris
@Chris 如果 initializerNone,则使用 iterable[0] 作为初始化器,但在您的情况下,[][0] 不存在,因此出现错误。 - Guimoute

5

reduce()需要一个初始值来开始其操作。如果序列中没有值且没有显式指定的初始值,则无法开始操作,也不会有有效的返回值。为了让它能够在空序列上运行,请指定显式的初始值:

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

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