我之前创建了一个递归函数来查找列表的产品。
现在我创建了相同的函数,但使用了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函数的问题只是它不是为了处理和清空列表而设计的吗?或者还有其他原因吗?
我似乎无法在网上找到问题或任何解释原因的问题,我只能找到解决该特定问题的问题,不能解释。
答案 0 :(得分:12)
如果存在可选的初始值设定项,则它将放置在计算中的iterable项之前,并在iterable为空时用作默认值。如果没有给出初始值设定项且迭代只包含一个项目,则返回第一个项目。
因此,如果您希望代码使用空列表,则应使用初始化程序:
>>> reduce(lambda x, y: x*y, [], 1)
1
答案 1 :(得分:5)
reduce()
需要初始值才能从中开始操作。如果序列中没有值且没有显式值,那么它就无法开始操作,也没有有效的返回值。指定显式初始值,以允许它以空序列运行:
print (reduce(lambda x, y: x*y, items, 1))