当我通过reduce(mul, a)
传递一个空列表时,我试图返回1而不是None。我的代码:
from operator import mul
def product_list(a):
for b in a:
b = reduce(mul, a)
if b == None:
return 1
return b
print product_list([])
无论我在哪里放置if语句来捕获空白列表,我仍然会收到None作为输出。我还在学习基础知识,但这对我来说毫无意义。我甚至尝试过
from operator import mul
def product_list(a):
if a == None:
return 1
else:
for b in a:
b = reduce(mul, a)
if b == None or a == None:
return 1
return b
print product_list([])
只是为了看看它是否会捕获None并返回1. reduce()是否按照我认为的方式行事,或者我的代码中是否存在明显的错误,禁止返回1并强制返回None?
答案 0 :(得分:6)
当a
为空列表时,您的函数不返回任何内容,默认返回值为None
。
测试顶部的空列表:
if not a:
return 1
在您的第二个功能中,您只测试if a == None
,但空列表[]
永远不会等于None
。请注意,测试None
的惯用方法是使用is
对象标识测试:
if a is None:
通过测试not a
,您可以同时捕获a
为空列表且为None
的情况。
否则你的代码没什么意义。循环遍历a
,但在第一次迭代中返回并退出函数:
for b in a:
b = reduce(mul, a)
if b == None:
return 1
return b # exit the function here, having only looked at the first element in `a`.
但是,我必须在你的帖子中修改缩进,并且可能误解了那些return
语句的缩进,在这种情况下,当传入一个空列表时,你会得到一个NameError
。 / p>
答案 1 :(得分:4)
您可以将第三个值传递给reduce
,该值用作初始值。
In [6]: reduce(mul, [], 1)
Out[6]: 1
这是处理空列表的最佳方法。案例None
应该真正在其他地方处理,因为它是一种不同的错误:程序的语义没有错,这是因为其他人给你的数据不好。你应该明确地抓住它,例如
if not isinstance(..., collections.Iterable):
# do something
当然,如果您传递的内容不可迭代,reduce
会引发错误,这可能就足够了。
答案 2 :(得分:2)
请注意,您没有传递空列表来减少,如您所说。试试吧:
>>> reduce(operator.mul, [])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: reduce() of empty sequence with no initial value
我想也许你不理解函数reduce
。我们不能反对你 - 它在python代码中使用不多。
也许您想要定义这样的函数:
from operator import mul
def product_list(a):
try:
return reduce(mul,a)
except TypeError:
return 1
现在你可以尝试一下:
print product_list([1,2,3,4]) #24
print product_list([]) #1
答案 3 :(得分:0)
if a is None or len(a) == 0:
return 1
如上所述检查空列表条件。