Mettre à jour:
Dans Python 3.8, la fonction prod a été ajoutée au module mathématique . Voir: math.prod () .
Informations plus anciennes: Python 3.7 et versions antérieures
La fonction que vous recherchez serait appelée prod () ou product () mais Python n'a pas cette fonction. Donc, vous devez écrire le vôtre (ce qui est facile).
Prononcé sur prod ()
Oui c'est vrai. Guido a rejeté l'idée d'une fonction prod () intégrée car il pensait qu'elle était rarement nécessaire.
Alternative avec réduire ()
Comme vous l'avez suggéré, il n'est pas difficile de créer le vôtre en utilisant réduire () et operator.mul () :
from functools import reduce # Required in Python 3
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
Notez que dans Python 3, la fonction Reduce () a été déplacée vers le module functools .
Cas spécifique: factorielles
En remarque, le principal cas d'utilisation motivant de prod () est de calculer les factorielles. Nous avons déjà un support pour cela dans le module mathématique :
>>> import math
>>> math.factorial(10)
3628800
Alternative avec logarithmes
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.
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:
la source
reduce
?product()
dans la bibliothèque standard, le nombre de vues sur cette question peut aider à plaider la cause.Il n'y en a pas de intégré, mais il est simple de rouler le vôtre, comme illustré ici :
Voir les réponses à cette question:
Quel module Python convient à la manipulation de données dans une liste?
la source
functools.reduce
plutôt quereduce
.prod = functools.partial(functools.reduce, operator.mul)
Il y a un
prod()
numpy qui fait ce que vous demandez.la source
np.prod(range(1,13))
donne la bonne réponse égale à 12! maisnp.prod(range(1,14))
non.np.prod(arange(1,14, dtype='object'))
?math.prod()
fonction rendra cette réponse obsolète.( ou
)
la source
Utilisez ceci
Puisqu'il n'y a pas de
prod
fonction intégrée.la source
lambda a,b: a*b
, ce n'est pas un problème. Mais réduire ne se généralise pas bien et est abusé. Je préfère que les débutants ne l'apprennent pas.Je préfère les réponses a et b ci-dessus en utilisant functools.reduce () et la réponse en utilisant numpy.prod () , mais voici encore une autre solution en utilisant itertools.accumulate () :
la source
Peut-être pas un "intégré", mais je le considère comme intégré. de toute façon il suffit d'utiliser numpy
la source