Atualizar:
No Python 3.8, a função prod foi adicionada ao módulo de matemática . Veja: math.prod () .
Informações mais antigas: Python 3.7 e anterior
A função que você está procurando seria chamada prod () ou product (), mas o Python não tem essa função. Então, você precisa escrever o seu próprio (o que é fácil).
Pronunciamento sobre prod ()
Sim está certo. Guido rejeitou a ideia de uma função interna prod () porque achava que raramente era necessária.
Alternativa com reduzir ()
Como você sugeriu, não é difícil criar o seu próprio uso, reduzindo () e operator.mul () :
from functools import reduce # Required in Python 3
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
Observe que, no Python 3, a função reduzir () foi movida para o módulo functools .
Caso específico: fatoriais
Como uma observação lateral, o principal caso de uso motivador de prod () é calcular fatoriais. Já temos suporte para isso no módulo de matemática :
>>> import math
>>> math.factorial(10)
3628800
Alternativa com logaritmos
Se seus dados consistirem em flutuadores, você poderá calcular um produto usando sum () com expoentes e logaritmos:
>>> 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
Observe que o uso de log () requer que todas as entradas sejam positivas.
Na verdade, Guido vetou a ideia: http://bugs.python.org/issue1093
Mas, como observado nessa edição, você pode criar uma facilmente:
fonte
reduce
?product()
na biblioteca padrão, o número de visualizações sobre esta questão pode ajudar a defender o caso.Não há um incorporado, mas é simples criar o seu, como demonstrado aqui :
Veja as respostas para esta pergunta:
Qual módulo Python é adequado para manipulação de dados em uma lista?
fonte
functools.reduce
vez dereduce
.prod = functools.partial(functools.reduce, operator.mul)
Há um
prod()
numpy que faz o que você está pedindo.fonte
np.prod(range(1,13))
fornece a resposta correta igual a 12! masnp.prod(range(1,14))
não.np.prod(arange(1,14, dtype='object'))
?math.prod()
função tornará esta resposta obsoleta.(ou
)
fonte
Usa isto
Uma vez que não há
prod
função incorporada.fonte
lambda a,b: a*b
não é um problema. Mas reduzir não generaliza bem e é abusado. Eu prefiro que iniciantes não aprendam.Eu prefiro as respostas a e b acima usando functools.reduce () ea resposta usando numpy.prod () , mas aqui é outra solução usando itertools.accumulate () :
fonte
Talvez não seja um "embutido", mas eu considero isso embutido. de qualquer forma, basta usar entorpecido
fonte