Python的sum()
函数返回一个可迭代的数字之和。
sum([3,4,5]) == 3 + 4 + 5 == 12
我正在寻找返回产品的函数。
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
我很确定存在这样的功能,但是找不到。
Python的sum()
函数返回一个可迭代的数字之和。
sum([3,4,5]) == 3 + 4 + 5 == 12
我正在寻找返回产品的函数。
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
我很确定存在这样的功能,但是找不到。
Answers:
在Python 3.8中,prod函数已添加到math模块。请参阅:math.prod()。
您要查找的函数称为prod()或product(),但Python没有该函数。因此,您需要编写自己的代码(很简单)。
是的,这是对的。Guido 拒绝了内置prod()函数的想法,因为他认为很少需要它。
正如您建议的那样,使用reduce()和operator.mul()制作自己的东西并不难:
from functools import reduce # Required in Python 3
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
请注意,在Python 3中,reduce()函数已移至functools模块。
附带说明一下,prod()的主要动机用例是计算阶乘。我们已经在math模块中对此提供了支持:
>>> 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()要求所有输入均为正。
实际上,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()
在标准库中,那么对该问题的意见数量可能会有助于解决问题。
没有一个内置的,但其实很简单推出自己的,这表现在这里:
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
查看此问题的答案:
functools.reduce
代替reduce
。
prod = functools.partial(functools.reduce, operator.mul)
有一个prod()
在numpy的,做你问什么。
np.prod(range(1,13))
给出的正确答案等于12!但np.prod(range(1,14))
事实并非如此。
np.prod(arange(1,14, dtype='object'))
?
math.prod()
功能将使该答案过时。
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不能很好地推广,会被滥用。我更喜欢初学者不学习它。
我更喜欢使用functools.reduce()和上面的答案a和b使用numpy.prod()答案,但这是使用itertools.accumulate()的另一种解决方案:
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]