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

Pat*_*ney 181 python product built-in pep

Python的sum()函数返回迭代中的数字总和.

sum([3,4,5]) == 3 + 4 + 5 == 12
Run Code Online (Sandbox Code Playgroud)

我正在寻找返回产品的功能.

somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
Run Code Online (Sandbox Code Playgroud)

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

ojr*_*rac 206

实际上,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)
Run Code Online (Sandbox Code Playgroud)

  • Guido也不是那种不喜欢`reduce`的人吗? (12认同)
  • 如果使用Python 3,请使用`functools.reduce`而不是`reduce`. (6认同)
  • 刚刚在[Guido的博客文章中发现了关于reduce()]的这个金块(http://www.artima.com/weblogs/viewpost.jsp?thread=98196).**"我们已经有了sum();我很乐意交易reduce()for product()......"**.如果有人想请求在标准库中包含`product()`,那么这个问题的观点数量可能有助于说明问题. (5认同)
  • 这是一个很好的例子,其中有"需要这个",引用Guido:product(filter(None,[1,2,3,None])).希望有一天它会被包括在内. (4认同)
  • 是的 - 并且reduce甚至不再是Python 3内置的.IMO,当标准(或第三方)库可以做时,我们不需要将所有可能的列表运算符添加到全局内置函数中.你拥有的内置词越多,越常用的词就会成为局部变量名的禁区. (2认同)
  • @PatrickMcElhaney 这听起来像python3已经摆脱了reduce内置。我认为产品错过了机会。;) (2认同)
  • 那么为什么 sum() 获得了免费通行证呢? (2认同)

Ray*_*ger 46

更新:

在Python 3.8中,prod函数被添加到math模块中.请参阅:math.prod().

旧信息:Python 3.7及之前版本

您正在寻找的函数将被称为prod()product(),但Python没有该函数.所以,你需要自己编写(这很容易).

在prod()上发音

恩,那就对了.Guido 拒绝了内置prod()函数的想法,因为他认为很少需要它.

替代reduce()

正如您所建议的那样,使用reduce()operator.mul()制作自己并不难:

from functools import reduce
def prod(iterable):
    return reduce(operator.mul, iterable, 1)

>>> prod(range(1, 5))
24
Run Code Online (Sandbox Code Playgroud)

在Python 3中,reduce()函数被移动到functools模块,因此您需要添加:

from functools import reduce
Run Code Online (Sandbox Code Playgroud)

具体案例:因子

作为旁注,prod()的主要激励用例是计算阶乘.我们已经在数学模块中对此有所支持:

>>> import math

>>> math.factorial(10)
3628800
Run Code Online (Sandbox Code Playgroud)

替代对数

如果您的数据由浮点数组成,则可以使用带有指数和对数的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
Run Code Online (Sandbox Code Playgroud)

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

  • 您可能需要补充一点,最后一个示例中的浮点数必须为_正_。否则,您可能必须使用 cmath,但即使如此,它也无法在所有情况下真正起作用。 (2认同)

zwe*_*nde 40

没有一个内置的,但其实很简单推出自己的,这表现在这里:

import operator
def prod(factors):
    return reduce(operator.mul, factors, 1)
Run Code Online (Sandbox Code Playgroud)

查看此问题的答案:

哪个Python模块适合列表中的数据操作?

  • 如果使用Python 3,请使用`functools.reduce`而不是`reduce`. (7认同)
  • 为了获得更多的 functools 乐趣:`prod = functools.partial(functools.reduce, operator.mul)` (2认同)

小智 36

有一个prod()numpy可以满足您的需求.

  • 注意:不支持Python long(任意精度整数),所以`np.prod(range(1,13))`给出的正确答案等于12!但是`np.prod(range(1,14))`没有. (3认同)
  • @JasonS`np.prod(arange(1,14,dtype ='object'))`? (2认同)

Ste*_* B. 22

Numeric.product 
Run Code Online (Sandbox Code Playgroud)

( 要么

reduce(lambda x,y:x*y,[3,4,5])
Run Code Online (Sandbox Code Playgroud)

)

  • 什么是"数字"? (5认同)
  • @CraigMcQueen Numeric是(numpy)的前身之一. (3认同)
  • 但如果没有,他可能仍然想要这个功能。 (2认同)
  • 是的,但他需要知道一个不存在,因为这是他的主要问题。 (2认同)
  • 您还必须将r​​educe值设置为1,否则将在null情况下失败.空序列的乘积定义为1. (2认同)

S.L*_*ott 19

用这个

def prod(iterable):
    p = 1
    for n in iterable:
        p *= n
    return p
Run Code Online (Sandbox Code Playgroud)

由于没有内置prod功能.

  • 你必须认为减少真的是反模式:) (6认同)
  • @zweiterlinde:对于初学者来说,减少导致问题.在这种情况下,使用`lambda a,b:a*b`,这不是问题.但是,减少并不能很好地概括,并且会被滥用.我更喜欢初学者不学习它. (5认同)
  • 他想知道是否存在他可以使用的现有功能。 (2认同)

kat*_*ex7 5

也许不是“内置”,但我认为它是内置的。反正只是使用 numpy

import numpy 
prod_sum = numpy.prod(some_list)
Run Code Online (Sandbox Code Playgroud)

  • 这与“在我的机器上可以工作”的说法非常接近!Numpy 尽管很可爱,但明确地“不是”内置函数。 (3认同)