Actualizar:
En Python 3.8, la función prod se agregó al módulo matemático . Ver: math.prod () .
Información anterior: Python 3.7 y anteriores
La función que está buscando se llamaría prod () o product () pero Python no tiene esa función. Entonces, necesitas escribir el tuyo (lo cual es fácil).
Pronunciamiento en prod ()
Si, eso es correcto. Guido rechazó la idea de una función prod () incorporada porque pensó que rara vez era necesaria.
Alternativa con reduce ()
Como sugirió, no es difícil hacer el suyo usando reduce () y operator.mul () :
from functools import reduce # Required in Python 3
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
Tenga en cuenta que en Python 3, la función reduce () se movió al módulo functools .
Caso específico: factoriales
Como nota al margen, el principal caso de uso motivador para prod () es calcular factoriales. Ya tenemos soporte para eso en el módulo de matemáticas :
>>> import math
>>> math.factorial(10)
3628800
Alternativa con logaritmos
Si sus datos consisten en flotantes, puede calcular un producto usando sum () con exponentes y 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
Tenga en cuenta que el uso de log () requiere que todas las entradas sean positivas.
En realidad, Guido vetó la idea: http://bugs.python.org/issue1093
Pero, como se señaló en ese número, puede hacer uno con bastante facilidad:
fuente
reduce
?product()
en la biblioteca estándar, el número de puntos de vista sobre esta pregunta puede ayudar a resolver el caso.No hay uno incorporado, pero es simple rodar el suyo, como se demuestra aquí :
Ver respuestas a esta pregunta:
¿Qué módulo de Python es adecuado para la manipulación de datos en una lista?
fuente
functools.reduce
lugar dereduce
.prod = functools.partial(functools.reduce, operator.mul)
Hay una
prod()
en numpy que hace lo que estás pidiendo.fuente
np.prod(range(1,13))
da la respuesta correcta igual a 12 Peronp.prod(range(1,14))
no lo hace.np.prod(arange(1,14, dtype='object'))
?math.prod()
función hará que esta respuesta sea obsoleta.(o
)
fuente
Utilizar este
Dado que no hay una
prod
función incorporada.fuente
lambda a,b: a*b
, no es un problema. Pero reducir no se generaliza bien y se abusa de él. Prefiero que los principiantes no lo aprendan.Yo prefiero las respuestas una y b anteriores utilizando functools.reduce () y la respuesta utilizando numpy.prod () , pero aquí es otra solución utilizando itertools.accumulate () :
fuente
Quizás no sea un "incorporado", pero lo considero incorporado. de todos modos solo use numpy
fuente