【发布时间】:2010-10-10 08:53:35
【问题描述】:
Python 的 sum() 函数返回可迭代对象中数字的总和。
sum([3,4,5]) == 3 + 4 + 5 == 12
我正在寻找返回产品的函数。
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
我很确定这样的功能存在,但我找不到。
【问题讨论】:
标签: python product built-in pep
Python 的 sum() 函数返回可迭代对象中数字的总和。
sum([3,4,5]) == 3 + 4 + 5 == 12
我正在寻找返回产品的函数。
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
我很确定这样的功能存在,但我找不到。
【问题讨论】:
标签: python product built-in pep
实际上,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)
【讨论】:
reduce的人吗?
product(),那么这个问题的浏览量可能有助于证明这一点。
在 Python 3.8 中,prod 函数被添加到 math 模块中。请参阅:math.prod()。
您要查找的函数将称为 prod() 或 product(),但 Python 没有该函数。所以,你需要自己写(这很容易)。
是的,没错。 Guido rejected the idea 用于内置 prod() 函数,因为他认为它很少需要。
正如您所建议的,使用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 module。
附带说明,prod() 的主要激励用例是计算阶乘。我们已经在math module 中提供了支持:
>>> 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() 的使用要求所有输入都是正数。
【讨论】:
在 numpy 中有一个 prod() 可以满足您的要求。
【讨论】:
np.prod(range(1,13)) 给出的正确答案等于 12!但np.prod(range(1,14)) 没有。
np.prod(arange(1,14, dtype='object'))?
math.prod() 函数将使这个答案过时。
没有内置的,但很容易自己滚动,如 here 所示:
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
查看此问题的答案:
Which Python module is suitable for data manipulation in a list?
【讨论】:
functools.reduce 而不是 reduce。
prod = functools.partial(functools.reduce, operator.mul)
Numeric.product
(或
reduce(lambda x,y:x*y,[3,4,5])
)
【讨论】:
使用这个
def prod(iterable):
p = 1
for n in iterable:
p *= n
return p
由于没有内置的prod 函数。
【讨论】:
lambda a,b: a*b,这不是问题。但是 reduce 不能很好地概括,并且被滥用。我更喜欢初学者而不是学习它。
也许不是“内置”,但我认为它是内置的。无论如何,只需使用 numpy
import numpy
prod_sum = numpy.prod(some_list)
【讨论】:
我更喜欢上面使用functools.reduce() 和answer 使用numpy.prod() 的答案a 和b,但这里还有另一个使用itertools.accumulate() 的解决方案:
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]
【讨论】: