Est-ce que cette fonction doivent utiliser réduire () ou est-il un moyen plus pythonique?

StackOverflow https://stackoverflow.com/questions/3843188

Question

Si j'ai une valeur et une liste de termes supplémentaires que je veux multiplier la valeur:

n = 10
terms = [1,2,3,4]

Est-il possible d'utiliser une compréhension de la liste pour faire quelque chose comme ceci:

n *= (term for term in terms) #not working...

Ou est la seule façon:

n *= reduce(lambda x,y: x*y, terms)

est en Python 2.6.2. Merci!

Était-ce utile?

La solution

Réduire n'est pas la seule façon. Vous pouvez également écrire comme une simple boucle:

for term in terms:
    n *= term

Je pense que cela est beaucoup plus clair que l'utilisation reduce, surtout quand on considère que beaucoup de programmeurs Python ont jamais vu reduce et le nom ne contribue guère à transmettre aux gens qui le voient pour la première fois ce qu'il fait.

Pythonic ne signifie pas tout écriture comme compréhensions ou toujours utiliser un style fonctionnel si possible . Python est un langage multi-paradigme et l'écriture de code simple impératif, le cas échéant est Pythonic.

Guido van Rossum ne veut pas non plus reduce en Python:

  

réduire maintenant (). Ceci est en fait celui que j'ai toujours haï le plus, parce que, à part quelques exemples impliquant + ou *, presque chaque fois que je vois une réduction () appel avec un argument de fonction non triviale, je dois stylo saisir et papier diagramme ce qui est réellement introduit dans cette fonction avant de comprendre ce que la réduire () est censé faire. l'applicabilité de réduire () est à peu près limitée aux opérateurs associatifs, et dans tous les autres cas, il est préférable d'écrire la boucle d'accumulation explicitement dans mon esprit,.

     

Il n'y a pas beaucoup d'opérateurs associatifs. (Ce sont les opérateurs X pour lesquels (a X b) X c est égal à un X (b X c).) Je pense qu'il est à peu près limité à +, *, &, |, ^, et le raccourci et / ou. Nous avons déjà la somme (); Je retournerais avec plaisir le commerce réduis () pour le produit (), de sorte que prend en charge les deux la plupart des utilisations courantes. [...]

En Python 3 réduire a été déplacé vers le module de functools.

Autres conseils

reduce est la meilleure façon de faire de l'OMI, mais vous ne devez pas utiliser un lambda; à la place, vous pouvez utiliser l'opérateur * directement:

import operator
n *= reduce(operator.mul, terms)

n est maintenant Voir la documentation 240. pour le rel="nofollow"> pour plus d'informations.

Encore une autre façon:

import operator
n = reduce(operator.mul, terms, n)
scroll top