与 sum() 类似但用于乘法的函数是什么?product() 是什么?
- 2025-01-16 08:38:00
- admin 原创
- 82
问题描述:
Python 的sum()
函数返回可迭代对象中的数字之和。
sum([3,4,5]) == 3 + 4 + 5 == 12
我正在寻找返回产品的函数。
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
我很确定这样的功能存在,但我找不到它。
解决方案 1:
从历史上看,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)
解决方案 2:
更新:
在 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()的主要用例是计算阶乘。我们已经在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()要求所有输入都是正数。
解决方案 3:
numpy 中有一个功能prod()
可以完成您所要求的操作。
解决方案 4:
虽然没有内置,但您可以轻松自行创建,如下所示:
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
查看此问题的答案:
哪个 Python 模块适合列表中的数据操作?
解决方案 5:
Numeric.product
( 或者
reduce(lambda x,y:x*y,[3,4,5])
)
解决方案 6:
使用这个
def prod(iterable):
p = 1
for n in iterable:
p *= n
return p
因为没有内置prod
函数。
解决方案 7:
也许不是“内置”,但我认为它是内置的。无论如何只需使用 numpy
import numpy
prod_sum = numpy.prod(some_list)
解决方案 8:
我更喜欢使用functools.reduce() 的上述答案a和b以及使用numpy.prod() 的答案,但这里还有另一个使用itertools.accumulate() 的解决方案:
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]
解决方案 9:
您还可以将数字列表编码为pd.Series
,然后使用pd.Series.product()
:
>>> import pandas as pd
>>> pd.Series([5,3,-1]).product()
-15
解决方案 10:
如果您不想导入任何内容:
eval("*".join([str(num) for num in list_of_numbers]))