La Prensa Industrial (Comprehensions)
Fig. 8.5: Una comprehension transforma y filtra en una sola expresión.
Ya conoces la Línea de Ensamblaje (for): detiene cada caja, le hace lo que haga falta, la coloca y sigue con la siguiente. Para trabajos de varios pasos es imbatible. Pero cuando la tarea es una sola operación repetida (aplicarle el IVA a cada precio, sacar cada nombre en mayúsculas), montar toda la línea es demasiado aparato. Para eso el almacén tiene otra máquina: la Prensa Industrial. Metes la colección completa, defines el troquel, y la lista nueva sale de un solo golpe.
Sintaxis de la Prensa
La fórmula que comprime tres líneas en una sola:
# [ NUEVO_VALOR for VARIABLE in ORIGINAL ]
Comparación de Estilos
Con la línea de ensamblaje (for):
precios = [100, 250, 80]
con_iva = []
for precio in precios:
con_iva.append(precio * 1.16)
Con la prensa (comprehension):
precios = [100, 250, 80]
con_iva = [precio * 1.16 for precio in precios]
Mismo resultado, una fracción del esfuerzo. El troquel es la expresión de la izquierda (precio * 1.16); la prensa lo aplica a cada elemento sin que tú administres la lista vacía ni el .append().
Filtrado en la Prensa
La prensa también acepta un selector. Añade un if al final y el troquel solo procesa las piezas que cumplen la condición; el resto ni entra a la máquina.
stocks = [12, 0, 45, 3]
requieren_pedido = [s for s in stocks if s < 5]
print(requieren_pedido) # [0, 3]
¿Prensa o línea de ensamblaje?
La regla del taller: la prensa troquela una operación por pieza; la línea admite pasos arbitrarios (contadores, avisos, condiciones anidadas). Usa la comprehension cuando la transformación sea directa y quepa cómoda en una línea; si la lógica se complica, un for explícito es más honesto. Lo elegante, compacto y abiertamente “pythónico” no sirve de nada si quien lee no entiende qué salió de la prensa.
Resumen del Capítulo
- El bucle
forrecorre listas, diccionarios (.keys(),.values(),.items()) y cadenas;range()genera secuencias numéricas sin construir una lista completa. enumerate()entrega índice y elemento a la vez;zip()empareja dos colecciones para recorrerlas juntas.- El bucle
whilerepite mientras una condición sea cierta; algo dentro del cuerpo debe cambiar esa condición o el bucle nunca termina. while Truecombinado conbreakes el patrón estándar cuando no sabes de antemano cuántas vueltas hacen falta (el motor de un menú).breakdetiene el bucle por completo;continuesalta solo la vuelta actual y sigue con la siguiente.- Los Patrones Comunes (acumulador, contador, bandera, filtrado, récord) resuelven la mayoría de las tareas de recorrido; varios ya vienen hechos como
sum(),len(),max(),min(). - La Prensa Industrial (Comprehensions) (
[expresión for elemento in coleccion if condición]) troquela una lista nueva en una sola expresión, cuando la transformación es directa.