Что такое функция sum (), но для умножения? продукт()?


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

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

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

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

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

7 144

7 ответов:

резюме

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

произнесение на prod ()

Да, это верно. Гвидо отверг идею для встроенной функции 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)

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

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

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

Numeric.product 

( или

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

)

использовать

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

Так как нет встроенного

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

import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]