El list comprehension apareció en versiones tempranas de Python. Este azúcar sintáctico fue tomado de lenguajes funcionales. Hace que el código sea más compacto y a veces incluso un poco más rápido que un bucle for normal.
Muchos desarrolladores inexpertos utilizan list comprehensions sin comprender sus particularidades, lo que conduce a una peor legibilidad o a la aparición de efectos inesperados en el código. Además, a los nuevos desarrolladores les resulta difícil diferenciar entre el uso de list comprehensions y las funciones map/filter/lambda.
El list comprehension es una forma rápida de crear una nueva lista aplicando una expresión a cada elemento de la secuencia original:
nums = [1, 2, 3, 4] squares = [x*x for x in nums if x % 2 == 0] # [4, 16]
Características clave:
¿Devuelve list comprehension un generador?
No, devuelve una lista. Un generador se crea con paréntesis:
# Este es un generador: (x*x for x in range(10)) # Esta es una lista: [x*x for x in range(10)]
¿Se puede asignar valores a las variables dentro del list comprehension?
En la sintaxis estándar no se puede. Solo mediante la expresión "walrus" (:=) desde Python 3.8+:
[x for x in (y := range(5))] # ¡Error! [x for x in [(y := i*i) for i in range(5)]] # y es visible solo en esta lista
¿Se pueden modificar variables externas dentro del list comprehension?
La variable declarada dentro del list comprehension es local y no será visible desde afuera. Esto confunde a menudo a los principiantes en construcciones anidadas.
** Caso negativo Un desarrollador utiliza list comprehensions anidadas para una transformación de datos compleja en una sola línea. Ventajas: Código compacto, efecto de "¡sé Python!" Desventajas: Difícil de leer, los nuevos colegas sufren, la depuración se vuelve dolorosa ** Caso positivo Un desarrollador utiliza list comprehensions simples para filtrar y transformar listas cortas, y para operaciones complejas escribe funciones y bucles explícitos. Ventajas: El código es fácil de leer, mantener y extender Desventajas: En algunos casos, el código es un poco más largo y se utilizan variables adicionales