231 votes

Quelle est la fonction comme sum() mais pour la multiplication ? product() ?

Python sum() renvoie la somme des nombres dans un itérable.

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 presque sûr qu'une telle fonction existe, mais je ne la trouve pas.

217voto

ojrac Points 6897

En fait, Guido a mis son veto à cette idée : http://bugs.python.org/issue1093

Mais, comme indiqué dans ce numéro, vous pouvez en fabriquer 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)

4 votes

Voici un excellent exemple de cas où il y a un "besoin de ceci", pour citer Guido : product(filter(None, [1,2,3,None])). Espérons qu'il sera inclus un jour.

14 votes

Guido n'est-il pas aussi le gars qui n'aime pas reduce ?

3 votes

Oui, et reduce n'est même plus un buildin dans Python 3. IMO, nous n'avons pas besoin de tous les opérateurs de liste possibles ajoutés aux builtins globaux quand une bibliothèque standard (ou tierce) ferait l'affaire. Plus vous avez de builtins, plus les mots communs deviennent hors limites comme noms de variables locales.

42voto

zweiterlinde Points 5984

Il n'y en a pas d'intégré, mais il est facile d'en créer un, comme le montre l'exemple ci-dessous. 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 ?

8 votes

Si vous utilisez Python 3, utilisez functools.reduce au lieu de reduce .

2 votes

Pour encore plus de functools : prod = functools.partial(functools.reduce, operator.mul)

0 votes

Ainsi, en Python 3, j'ai besoin de deux importations pour faire quelque chose d'aussi basique ? !

42voto

Benjamin Points 121

Il y a un prod() en numpy qui fait ce que vous demandez.

4 votes

Note : ne supporte pas les longs Python (entiers de précision arbitraire) donc np.prod(range(1,13)) donne la bonne réponse égale à 12 ! mais np.prod(range(1,14)) ne le fait pas.

2 votes

@JasonS np.prod(arange(1,14, dtype='object')) ?

1 votes

Le site math.prod() rendra cette réponse obsolète.

26voto

Steve B. Points 23227
Numeric.product 

( ou

reduce(lambda x,y:x*y,[3,4,5])

)

0 votes

Il veut une fonction qu'il peut charger à partir d'un module ou d'une bibliothèque, et non pas écrire la fonction lui-même.

2 votes

Mais s'il n'y en a pas, il veut probablement quand même la fonction.

2 votes

Oui, mais il doit savoir qu'il n'en existe pas, puisque c'est sa question principale.

23voto

S.Lott Points 207588

Utilisez cette

def prod(iterable):
    p = 1
    for n in iterable:
        p *= n
    return p

Puisqu'il n'y a pas de prod fonction.

6 votes

Vous devez penser que réduire est vraiment un anti-modèle :)

2 votes

Il veut savoir s'il existe une fonction existante qu'il peut utiliser.

0 votes

Et cette réponse explique qu'il n'y en a pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X