Что такое функция, как sum (), но для умножения? товар()? - PullRequest
168 голосов
/ 27 февраля 2009

Функция Python sum() возвращает сумму чисел в итерируемом.

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

Я ищу функцию, которая возвращает продукт.

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

Я почти уверен, что такая функция существует, но я не могу ее найти.

Ответы [ 8 ]

200 голосов
/ 27 февраля 2009

На самом деле, Гвидо наложил вето на идею: 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)
40 голосов
/ 27 февраля 2009

Там нет ни одного встроенного, но его просто свернуть, как показано здесь :

import operator
def prod(factors):
    return reduce(operator.mul, factors, 1)

Смотрите ответы на этот вопрос:

Какой модуль Python подходит для обработки данных в списке?

38 голосов
/ 06 февраля 2018

Обновление:

В Python 3.8 в модуль math была добавлена ​​функция prod . См .: math.prod () .

Старая информация: Python 3.7 и более ранние версии

Функция, которую вы ищете, будет называться prod () или product () , но Python не имеет этой функции. Итак, вам нужно написать свой собственный (что легко).

произношение на прод ()

Да, все верно. Гвидо отверг идею для встроенной функции prod (), потому что он думал, что она редко нужна.

Альтернатива при уменьшении ()

Как вы и предлагали, несложно сделать свой собственный, используя lower () и operator.mul () :

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

>>> prod(range(1, 5))
24

В Python 3 функция redu () была перемещена в модуль functools , поэтому вам необходимо добавить:

from functools import reduce

Конкретный случай: Факториалы

В качестве примечания, основной мотивирующий сценарий использования prod () - вычисление факториалов. У нас уже есть поддержка для этого в математическом модуле :

>>> 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 () требует, чтобы все входы были положительными.

35 голосов
/ 16 июня 2011

В numpy есть prod(), который делает то, что вы просите.

22 голосов
/ 27 февраля 2009
Numeric.product 

(или

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

)

16 голосов
/ 27 февраля 2009

Используйте это

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

Поскольку встроенной функции prod нет.

2 голосов
/ 30 ноября 2017

Я предпочитаю ответы a и b выше, используя functools.reduce () и ответ , используя numpy. prod () , но здесь есть еще одно решение, использующее itertools.accumulate () :

import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]
1 голос
/ 11 февраля 2019

Возможно, не "встроенный", но я считаю его встроенным. В любом случае просто используйте NumPy

import numpy 
prod_sum = numpy.prod(some_list)
...