¿Por qué la comprensión de la lista de python a veces es mal vista?

Muchos de los desarrolladores que he conocido sugieren que es una buena práctica ir con bucles simples y si las condiciones en lugar de una línea enumera las declaraciones de comprensión.

Siempre los he encontrado muy potentes, ya que puedo colocar una gran cantidad de código en una sola línea y evita que se creen muchas variables. ¿Por qué todavía se considera una mala práctica?

(¿Es lento?)

Las comprensiones de listas se utilizan para crear listas, por ejemplo:

squares = [item ** 2 for item in some_list] 

Para que los bucles sean mejores para hacer algo con los elementos de una lista (u otros objetos):

 for item in some_list: print(item) 

El uso de una comprensión de sus efectos secundarios, o un bucle for para crear una lista, generalmente está mal visto.


Algunas de las otras respuestas aquí abogan por convertir una comprensión en un bucle una vez que se vuelve demasiado larga. No creo que sea un buen estilo: las llamadas append requeridas para crear una lista todavía son feas. En su lugar, refactoriza en una función:

 def polynomial(x): return x ** 4 + 7 * x ** 3 - 2 * x ** 2 + 3 * x - 4 result = [polynomial(x) for x in some_list] 

Solo si está preocupado por la velocidad, ¡y ya ha realizado su perfilado! – Debes mantener la lista larga, ilegible, la comprensión.

No se considera malo.

Sin embargo, enumere las comprensiones que

  1. Tiene efectos secundarios, o
  2. Son más legibles como multilínea para bucle

generalmente son mal vistos.

En otras palabras, la legibilidad es importante.

Como un ejemplo excesivamente artificial del primer mal ejemplo:

 x = range(10) [x.append(5) for _ in xrange(5)] 

Básicamente, si no está almacenando el resultado y / o modifica algún otro objeto, entonces una comprensión de la lista es probablemente una mala idea.

Como ejemplo del segundo, eche un vistazo a casi cualquier entrada de código de golf escrita en python. Una vez que su comprensión de la lista comienza a convertirse en algo que no se puede leer de un vistazo, considere usar un bucle for.

No hay un impacto en el rendimiento (incluso si lo hubiera, no me preocuparía; si el rendimiento fuera tan importante, tiene el lenguaje equivocado). Algunos fruncen el ceño ante las comprensiones de la lista porque son un poco demasiado concisas para algunos, eso es una cuestión de preferencia personal. En general, me parece que las comprensiones de listas simples son mucho más legibles que sus equivalentes de bucle / condición, pero cuando comienzan a alargarse (por ejemplo, cuando comienzas a pasar los 80 caracteres), es posible que sean mejor reemplazadas por un bucle.