sum()的功能是什么,但要乘法呢?产品()?


206

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

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

我正在寻找返回产品的函数。

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

我很确定存在这样的功能,但是找不到。

Answers:


71

更新:

在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
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()要求所有输入均为正。


您可能还想补充一下,最后一个示例中的浮点数必须为。否则,您可能必须使用cmath,但是即使那样,它也并非在所有情况下都有效。
Veky

212

实际上,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)

4
这是一个引用Guido的“需要为此”的好例子:product(filter(None,[1,2,3,None]))。希望有一天它将包括在内。
The911s 2014年

13
吉多也不是不喜欢的人reduce吗?
克里斯·马丁

3
是的-并且reduce甚至不再是Python 3中的内置函数。IMO,我们不需要在标准(或第3方)库可以执行的时候将所有可能的列表运算符添加到全局内置函数中。您拥有的内建函数越多,越常见的单词作为局部变量名称将成为限制。
ojrac

7
刚在Guido的关于reduce()的博客文章中找到了这个块。“我们已经有了sum();我很乐意将reduce()换成product()...”。如果有人想请愿将其包含product()在标准库中,那么对该问题的意见数量可能会有助于解决问题。
Patrick McElhaney

1
@PatrickMcElhaney听起来像python3已经摆脱了reduce内置函数。我认为产品错过了机会。;)
ojrac


39

有一个prod()在numpy的,做你问什么。


3
注意:不支持Python longs(任意精度整数),因此np.prod(range(1,13))给出的正确答案等于12!但np.prod(range(1,14))事实并非如此。
杰森S

2
@JasonS np.prod(arange(1,14, dtype='object'))
endolith '16

1
math.prod()功能将使该答案过时。
伯努瓦P

当您想以简单的单行代码进行数学运算时,仍然必须乏味地导入数学。我想念reduce()和Guido拒绝的product()。
RCross

25
Numeric.product 

( 要么

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


他希望可以从模块或库中加载功能,而不是自己编写功能。
杰里米L,2009年

2
但是,如果没有,他可能仍然想要该功能。
DNS

1
是的,但是他需要知道一个不存在,因为这是他的主要问题。
杰里米L,2009年

2
您还必须将r​​educe的默认值设置为1,否则它将在null情况下失败。空序列的乘积被定义为1
亚伦罗布森

3
@CraigMcQueen Numeric是numpy的前任之一。
塔卡斯威尔2015年

22

用这个

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

由于没有内置prod功能。


6
您必须认为reduce确实是一种反模式:)
zweiterlinde

1
他想知道是否存在可以使用的现有功能。
杰里米L,2009年

这个答案说明没有答案。
EBGreen

5
@zweiterlinde:对于初学者,减少导致问题的可能性。在这种情况下,使用lambda a,b: a*b,这不是问题。但是reduce不能很好地推广,会被滥用。我更喜欢初学者不学习它。
S.Lott

@ S.Lott我从未见过任何初学者使用reduce,更不用说其他功能类似的构造了。哎呀,即使是“中级”程序员也通常不了解列表。
Mateen Ulhaq '18 -10-24


2

也许不是“内置”,但我认为它是内置的。无论如何,请使用numpy

import numpy 
prod_sum = numpy.prod(some_list)

危险地接近“在我的机器上工作”的声明!脾气暴躁,虽然很可爱,但显然不是内置的。
RCross
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.