Обновить:
В Python 3.8 функция prod была добавлена в математический модуль. Смотрите: math.prod () .
Более старая информация: Python 3.7 и более ранние
Функция, которую вы ищете, будет называться prod () или product (), но Python не имеет этой функции. Итак, вам нужно написать свой собственный (что легко).
Произношение на прод ()
Да это правильно. Гвидо отверг идею встроенной функции prod (), потому что он думал, что она редко нужна.
Альтернатива с помощью Reduce ()
Как вы и предлагали, не сложно сделать свой собственный, используя redu () и 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 функция redu () была перемещена в модуль functools .
Особый случай: Факториалы
В качестве примечания, основной мотивирующий вариант использования функции 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 () требует, чтобы все входы были положительными.
На самом деле Гвидо наложил вето на эту идею: http://bugs.python.org/issue1093
Но, как отмечено в этом выпуске, вы можете сделать это довольно легко:
источник
reduce
?product()
в стандартную библиотеку, количество просмотров по этому вопросу может помочь в обосновании.Там нет ни одного встроенного, но его просто свернуть, как показано здесь :
Смотрите ответы на этот вопрос:
Какой модуль Python подходит для обработки данных в списке?
источник
functools.reduce
вместоreduce
.prod = functools.partial(functools.reduce, operator.mul)
Там
prod()
в NumPy, который делает то, что вы просите.источник
np.prod(range(1,13))
дает правильный ответ, равный 12! ноnp.prod(range(1,14))
нет.np.prod(arange(1,14, dtype='object'))
?math.prod()
Функция сделает этот ответ устаревшим.( или
)
источник
Использовать это
Так как нет встроенной
prod
функции.источник
lambda a,b: a*b
, это не проблема. Но сокращение не обобщает хорошо, и подвергается насилию. Я предпочитаю, чтобы новички не изучали это.Я предпочитаю ответы a и b выше, используя functools.reduce (), и ответ, используя numpy.prod () , но вот еще одно решение, использующее itertools.accumulate () :
источник
Возможно, не «встроенный», но я считаю его встроенным. в любом случае просто использовать NumPy
источник