web-dev-qa-db-fra.com

Existe-t-il un produit intégré () en Python?

J'ai parcouru un tutoriel et un livre, mais je ne trouve aucune mention d'une fonction de produit intégrée, c'est-à-dire du même type que sum (), mais je n'ai rien trouvé de tel que prod().

Est-ce le seul moyen de trouver le produit d'éléments dans une liste en important l'opérateur mul()?

76
George Burrows

Déclaration

Oui c'est vrai. Guido a rejeté l'idée pour une fonction intégrée prod () car il pensait que c'était rarement nécessaire.

Mise à jour Python 3.8

Dans Python 3.8, prod () a été ajouté au module mathématique:

>>> from math import prod
>>> prod(range(1, 11))
3628800

Alternative avec réduction ()

Comme vous l'avez suggéré, il n'est pas difficile de créer votre propre en utilisant réduire () et operator.mul () :

def prod(iterable):
    return reduce(operator.mul, iterable, 1)

>>> prod(range(1, 5))
24

Dans Python 3, la fonction ) () a été déplacée vers le module functools , vous devez donc ajouter:

from functools import reduce

Cas spécifique: Factoriels

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

Alternative aux 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
90
Raymond Hettinger

Il n’ya pas de product dans Python, mais vous pouvez le définir comme

def product(iterable):
    return reduce(operator.mul, iterable, 1)

Ou, si vous avez NumPy, utilisez numpy.product.

19
Fred Foo

Puisque la fonction reduction () a été déplacée vers le module functools python 3. , vous devez adopter une approche différente.

Vous pouvez utiliser functools.reduce() pour accéder à la fonction:

product = functools.reduce(operator.mul, iterable, 1)

Ou, si vous voulez suivre l'esprit de l'équipe python (qui a supprimé reduce() parce qu'ils pensent que for serait plus lisible), faites-le avec une boucle:

product = 1
for x in iterable:
    product *= x
12
Paul Paulsen
from numpy import multiply, product
list1 = [2,2,2]
list2 = [2,2,2]
mult = 3
prod_of_lists = multiply(list1,list2)
>>>[4,4,4]
prod_of_list_by_mult = multiply(list1,mult)
>>>[6,6,6]
prod_of_single_array = product(list1)
>>>8

numpy a beaucoup de fonctions vraiment sympas pour les listes!

7
HuntR2