python - para - campos calculados en django
¿Cuál es la función de Python como sum() pero para la multiplicación? producto()? (7)
Resumen
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 se necesitaba.
Alternativa con reducir ()
Como sugirió, no es difícil crear su propio uso de reduce() y operator.mul() :
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
En Python 3, la función reduce() se movió al módulo functools , por lo que necesitaría agregar:
from functools import reduce
Caso específico: Factoriales
Como nota al margen, el caso de uso de motivación principal 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
La función sum()
Python 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 en su lugar.
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
Estoy bastante seguro de que existe tal función, pero no puedo encontrarla.
En realidad, Guido vetó la idea: http://bugs.python.org/issue1093
Pero, como se señala en ese tema, puedes hacer uno bastante fácil:
from functools import reduce # Valid in Python 2.6+, required in Python 3
import operator
reduce(operator.mul, (3, 4, 5), 1)
Hay un prod()
en numpy que hace lo que estás pidiendo.
No hay uno incorporado, pero es fácil de implementar, como se demuestra here :
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
Ver respuestas a esta pregunta:
¿Qué módulo de Python es adecuado para la manipulación de datos en una lista?
Prefiero las respuestas b anteriores usando reduce() y la answer usando numpy.prod() , pero aquí hay otra solución que usa itertools.accumulate() :
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]
Utilizar esta
def prod(iterable):
p = 1
for n in iterable:
p *= n
return p
Como no hay una función de prod
incorporada.
Numeric.product
(o
reduce(lambda x,y:x*y,[3,4,5])
)