Pregunta

Si tengo un valor, y una lista de términos adicionales que quiero multiplicado al valor:

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

¿Es posible utilizar una lista por comprensión a hacer algo como esto:

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

O es la única manera:

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

Este es el Python 2.6.2. Gracias!

¿Fue útil?

Solución

Reducir no es la única manera. También puede escribir como un bucle simple:

for term in terms:
    n *= term

Creo que esto es mucho más claro que el uso de reduce, sobre todo si tenemos en cuenta que muchos programadores de Python nunca han visto reduce y el nombre hace poco para transmitir a la gente que lo ve por primera vez lo que realmente hace.

Pythonic no significa escribir todo como comprensiones o Usar siempre un estilo funcional si es posible . Python es un lenguaje multi-paradigma y la escritura de código imperativo simple cuando es apropiado Pythonic.

Guido van Rossum tampoco quiere reduce en Python:

  

Así que ahora reducir (). Esto es en realidad la que siempre he odiado la mayoría, ya que, aparte de unos pocos ejemplos que involucran + o *, casi cada vez que veo una llamada reducir () con un argumento de función no trivial, tengo que agarrar la pluma y papel para diagrama de lo que realmente está siendo alimentado en esa función antes de que entienda lo que el reducir () se supone que debe hacer. Así que en mi mente, la aplicabilidad de reducir () es más o menos limitada a los operadores asociativos, y en todos los demás casos, es mejor escribir el bucle de acumulación de forma explícita.

     

No hay una gran cantidad de operadores asociativos. (Esos son los operadores de X para el cual (a X b) X c es igual a X (b X c).) Creo que es casi limitada a +, *, y, |, ^, y el acceso directo y / o. Ya tenemos sum (); Me volvería a Comercio reduce () para el producto (), de manera que se encarga de los dos usos más comunes. [...]

En Python 3 Reducir ha sido movido al módulo functools.

Otros consejos

reduce es la mejor manera de hacer esto OMI, pero no tiene que utilizar una lambda; en su lugar, puede utilizar el operador * directamente:

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

n es ahora 240. Véase la documentación para el href="http://docs.python.org/library/operator.html" rel="nofollow"> operador módulo

Sin embargo, otra manera:

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