¿Cuál es la función como suma() pero para multiplicación?producto()?
Pregunta
pitón sum()
La función devuelve la suma de números en un iterable.
sum([3,4,5]) == 3 + 4 + 5 == 12
Estoy buscando la función que devuelve el producto.
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
Estoy bastante seguro de que existe esa función, pero no puedo encontrarla.
Solución
En realidad, Guido vetado la idea: http://bugs.python.org/issue1093
Sin embargo, como se señaló en ese problema, puede hacer uno con bastante facilidad:
from functools import reduce # Valid in Python 2.6+, required in Python 3
import operator
reduce(operator.mul, (3, 4, 5), 1)
Otros consejos
Actualización:
En Python 3.8, el prod función se añadió a la math módulo. Ver:. math.prod ()
Información de Mayores: Python 3.7 y anteriores
La función que está buscando se llama prod () o producto () pero Python no tiene esa función. Por lo tanto, es necesario escribir su propio (que es fácil).
pronunciamiento sobre prod ()
Sí, eso es correcto. Guido rechazaron la idea para una función incorporada de prod () porque pensaba que rara vez se necesitaba.
Alternativa con reducir ()
Como se ha sugerido, no es difícil de hacer un juego usando reducir () y href="https://docs.python.org/3/library/operator.html#operator.mul" rel="noreferrer"> operador. mul () :
from functools import reduce
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
En Python 3, la Reducir () función se trasladó a la functools módulo , por lo que necesitaría añadir:
from functools import reduce
Caso específico: factoriales
Como nota al margen, la principal motivación para los casos de uso prod () es calcular factoriales. Ya tenemos el apoyo para que en el módulo matemático :
>>> import math
>>> math.factorial(10)
3628800
Alternativa con logaritmos
Si los datos se compone de los flotadores, se puede calcular un producto utilizando 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, el uso de log () requiere que todas las entradas son positivos.
No hay uno incorporado, pero es fácil de rodar su propia, como se demuestra aquí :
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
Ver las respuestas a esta pregunta:
Qué módulo Python es adecuado para los datos la manipulación en una lista?
Hay una prod()
en numpy que hace lo que está pidiendo.
Numeric.product
(o
reduce(lambda x,y:x*y,[3,4,5])
)
Utilizar esta
def prod(iterable):
p = 1
for n in iterable:
p *= n
return p
Como no hay incorporado prod
función.
Yo prefiero las respuestas un y b anteriormente usando functools.reduce () y la responder usando numpy.prod () , pero aquí es otra solución utilizando itertools.accumulate () :
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]
Tal vez no sea un "incorporado", pero considero que es incorporado. de todos modos sólo tiene que utilizar numpy
import numpy
prod_sum = numpy.prod(some_list)