Какова функция sum (), но для умножения? продукт()?
в Python sum()
функция возвращает сумму чисел в массиве.
sum([3,4,5]) == 3 + 4 + 5 == 12
Я ищу функцию, которая возвращает вместо продукта.
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
Я уверен, что такая функция существует, но я не могу найти его.
7 ответов
резюме
функции вы ищете назвали бы prod () или product () но Python не имеет этой функции. Итак, вам нужно написать свой собственный (это легко).
произнесение на prod ()
Да, правильно. Гвидо!--15-->отверг идею для встроенной функции prod (), потому что он думал, что это редко нужно.
альтернатива с уменьшением ()
как вы предложили, она не трудно сделать свой собственный с помощью уменьшить() и оператора.mul ():
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
в Python 3,уменьшить() функция была перемещена в модуль 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
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)
там нет одного встроенного, но это просто свернуть свой собственный, как показано здесь:
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
посмотреть ответы на этот вопрос:
Я предпочитаю ответы a и b, С помощью functools.reduce () и ответ используя и NumPy.prod (), но вот еще одно решение с использованием itertools.accumulate ():
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]