La fonction sum()
de Python renvoie la somme des nombres dans un itératif.
sum([3,4,5]) == 3 + 4 + 5 == 12
Je cherche la fonction qui renvoie le produit à la place.
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
Je suis à peu près sûr qu'une telle fonction existe, mais je ne la trouve pas.
En fait, Guido a opposé son veto à l'idée: http://bugs.python.org/issue1093
Mais, comme indiqué dans ce numéro, vous pouvez en créer un assez facilement:
from functools import reduce # Valid in Python 2.6+, required in Python 3
import operator
reduce(operator.mul, (3, 4, 5), 1)
Il n’en existe pas, mais il est simple de lancer le vôtre, comme le montre la démonstration ici :
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
Voir les réponses à cette question:
Quel module Python convient à la manipulation de données dans une liste?
Il y a un prod()
numpy qui fait ce que vous demandez.
Dans Python 3.8, la fonction prod a été ajoutée au module math. Voir: math.prod () .
La fonction que vous recherchez s'appellerait prod () ou product () mais Python ne dispose pas de cette fonction. Donc, vous devez écrire le vôtre (ce qui est facile).
Oui c'est vrai. Guido a rejeté l'idée } pour une fonction prod () intégrée car il pensait que c'était rarement nécessaire.
Comme vous l'avez suggéré, il n'est pas difficile de créer le vôtre avec réduire () et opérateur.mul () :
from functools import reduce
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
En Python 3, la fonction réduction () a été déplacée vers le module functools , vous devez donc ajouter:
from functools import reduce
En remarque, le principal cas d'utilisation motivant de prod () consiste à calculer des factoriels. Nous avons déjà un support pour cela dans le module mathématique :
>>> import math
>>> math.factorial(10)
3628800
Si vos données sont constituées de flottants, vous pouvez calculer un produit en utilisant sum () avec des exposants et des logarithmes:
>>> 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
Notez que l'utilisation de log () nécessite que toutes les entrées soient positives.
Numeric.product
( ou
reduce(lambda x,y:x*y,[3,4,5])
)
Utilisez ceci
def prod(iterable):
p = 1
for n in iterable:
p *= n
return p
Puisqu'il n'y a pas de fonction prod
intégrée.
Je préfère les réponses a et b en utilisant functools.reduce () et le answer en utilisant numpy.prod () , mais voici une autre solution using itertools.accumulate () :
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]
Peut-être pas un "intégré", mais je le considère comme intégré. de toute façon il suffit d'utiliser numpy
import numpy
prod_sum = numpy.prod(some_list)