使用reduce mul在空白列表中返回1而不是None

时间:2013-01-02 18:59:26

标签: python list reduce

当我通过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?

4 个答案:

答案 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

如上所述检查空列表条件。