Python的sum()函数返回一个可迭代对象中数字的和。

sum([3,4,5]) == 3 + 4 + 5 == 12

我要找的是返回乘积的函数。

somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60

我很确定这样一个函数存在,但我找不到它。


当前回答

使用这个

def prod(iterable):
    p = 1
    for n in iterable:
        p *= n
    return p

因为没有内置的prod函数。

其他回答

使用这个

def prod(iterable):
    p = 1
    for n in iterable:
        p *= n
    return p

因为没有内置的prod函数。

Numeric.product 

(或

reduce(lambda x,y:x*y,[3,4,5])

)

实际上,Guido否决了这个想法:http://bugs.python.org/issue1093

但是,正如那期杂志中提到的,你可以很容易地做出一个:

from functools import reduce # Valid in Python 2.6+, required in Python 3
import operator

reduce(operator.mul, (3, 4, 5), 1)

它没有内置的,但你可以简单地自己滚动,如下所示:

import operator
def prod(factors):
    return reduce(operator.mul, factors, 1)

请看这个问题的答案:

哪个Python模块适合在列表中进行数据操作?

更新:

在Python 3.8中,prod函数被添加到math模块中。看:math.prod()。

旧信息:Python 3.7及以前版本

你要找的函数将被称为prod()或product(),但Python没有这个函数。所以,你需要自己编写(这很简单)。

关于prod()的声明

是的,没错。Guido拒绝了内置prod()函数的想法,因为他认为很少需要它。

使用reduce()替代

正如你所建议的,使用reduce()和operator.mul()来创建自己的函数并不难:

from functools import reduce  # Required in Python 3
import operator
def prod(iterable):
    return reduce(operator.mul, iterable, 1)

>>> prod(range(1, 5))
24

注意,在Python 3中,reduce()函数被移动到functools模块。

具体情况:阶乘

顺便说一句,prod()的主要用途是计算阶乘。我们已经在数学模块中提供了支持:

>>> import math

>>> math.factorial(10)
3628800

可选对数

如果你的数据由浮点数组成,你可以使用sum()与指数和对数计算乘积:

>>> from math import log, exp

>>> data = [1.2, 1.5, 2.5, 0.9, 14.2, 3.8]
>>> exp(sum(map(log, data)))
218.53799999999993

>>> 1.2 * 1.5 * 2.5 * 0.9 * 14.2 * 3.8
218.53799999999998

注意,使用log()要求所有输入都是正的。