Procesando Listas (for)
El bucle for es la Línea de Ensamblaje del almacén. Cuando tienes una fila de cajas y necesitas hacerle exactamente lo mismo a cada una, este es el mecanismo que usas. No el while, no una función recursiva. El for.
Fig. 8.2: El bucle for como línea de ensamblaje.
Sintaxis de la Línea
# variable_temporal colección
for producto in caja_de_productos:
# Acción a repetir
print(f"Procesando: {producto}")
La variable producto actúa como la pinza del brazo robótico: agarra el primer ítem, ejecuta la acción, lo suelta, y pasa al siguiente sin que tú tengas que indicarle cuándo moverse.
Recorriendo Rangos (range)
No siempre quieres procesar una colección de cajas. A veces solo necesitas repetir una operación un número fijo de veces. Ahí entra range(), que genera una secuencia de números sin construir la lista completa en memoria.
# Repetir 5 veces
for i in range(5):
print(f"Vuelta número {i}")
Esto imprimirá: 0, 1, 2, 3, 4 (Recuerda que empezamos en 0).
range también acepta un inicio y un paso. La regla, una vez más, es que el número final no entra:
for i in range(1, 6):
print(i)
for i in range(0, 10, 2):
print(i)
Antes de correrlo: ¿en qué número termina el primer bucle? ¿Y el segundo?
El primero imprime 1, 2, 3, 4, 5 (el 6 se queda fuera). El segundo imprime 0, 2, 4, 6, 8, de dos en dos, sin llegar al 10.
Iterando sobre otras cosas
El for no discrimina. Funciona con cualquier colección del almacén:
- Listas: Elemento por elemento.
- Diccionarios: Clave por clave.
- Textos: Letra por letra.
texto = "HOLA"
for letra in texto:
print(letra)
# Imprime:
# H
# O
# L
# A
Recorrer el Banco de Casilleros (Diccionarios)
Esta es la promesa pendiente del Capítulo 5, cumplida. Un diccionario se puede recorrer de tres formas, y la diferencia está en qué te entrega cada vuelta:
producto = {"nombre": "Tornillos", "precio": 5.5, "stock": 500}
# Solo la etiqueta de cada casillero
for clave in producto.keys():
print(clave)
# Solo el contenido
for valor in producto.values():
print(valor)
# Las dos cosas a la vez: la forma que casi siempre quieres
for clave, valor in producto.items():
print(f"{clave}: {valor}")
Un detalle que confunde al principio: for clave in producto: (sin método) equivale a .keys(). Python recorre las etiquetas por defecto, no los contenidos. Y sí, ese clave, valor de .items() es otra vez el desempaque de tuplas: cada vuelta entrega el par ("nombre", "Tornillos") y tú lo repartes en dos variables.
¿Y el caso estrella? Recorrer una lista de diccionarios, la estructura del proyecto final:
inventario = [
{"nombre": "Tornillos", "stock": 500},
{"nombre": "Tuercas", "stock": 200},
]
for item in inventario:
print(f"{item['nombre']}: {item['stock']} unidades")
Cada vuelta te da un diccionario completo (item), y adentro navegas con sus claves. Bucle afuera, casilleros adentro.
Numerar y Emparejar (enumerate, zip)
Dos atajos que vas a usar muchísimo.
Cuando necesitas el elemento y su posición, no recurras a range(len(...)). enumerate te entrega los dos a la vez:
productos = ["Martillo", "Taladro", "Sierra"]
for indice, producto in enumerate(productos):
print(f"{indice}: {producto}")
# 0: Martillo
# 1: Taladro
# 2: Sierra
Cuando tienes dos listas en paralelo y quieres recorrerlas juntas, zip las empareja:
productos = ["Martillo", "Taladro"]
precios = [50, 120]
for producto, precio in zip(productos, precios):
print(f"{producto}: ${precio}")
# Martillo: $50
# Taladro: $120
Fíjate: en cada vuelta desempacas una tupla (indice, producto y producto, precio), el mismo movimiento que viste en el capítulo de tuplas.