9 · for, range, enumerate y zip
Itera sobre cualquier secuencia, empareja elementos de dos listas y adjunta índices — los patrones que usa todo ciclo de entrenamiento.
El bucle `for` de Python itera directamente sobre cualquier iterable — raramente necesitas un contador de índice.
Sin esto:
Sin `for`, toda operación repetida tiene que escribirse a mano — no puedes procesar un dataset con 1 000 000 filas, y mucho menos ejecutar 100 épocas.
El bucle for de Python vincula un nombre a cada elemento de un iterable en secuencia. Strings, listas, tuplas, sets, dicts, archivos, generadores — todo lo que sea iterable funciona. Sin aritmética de índices.
Python (in browser)
`float('inf')` es un centinela que cualquier pérdida real superará en la primera comparación — un patrón limpio para rastrear mínimos acumulados.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
range(stop) genera enteros [0, stop). La forma de tres argumentos range(start, stop, step) es la versión general — step puede ser negativo para bucles de cuenta regresiva.
Python (in browser)
Los bucles de época siempre empiezan desde 1 para logs legibles — usa `range(1, n_epochs + 1)` en vez de sumar 1 dentro del print.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`enumerate` desempaca como pares `(índice, valor)`. La palabra clave `start=` te permite empezar a contar desde cualquier entero.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`zip` se detiene en la secuencia más corta. Usa `itertools.zip_longest` si necesitas emparejar listas de distinta longitud sin descartar elementos.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
¿Qué devuelve `list(range(2, 10, 3))`?
Aplica range, enumerate y zip en el Arena — el desafío construye un mini iterador de batches.
- `for x in iterable` es el bucle idiomático de Python — sin aritmética de índices, sin errores de desfase por uno.
- `range(start, stop, step)` genera secuencias de enteros bajo demanda sin asignar una lista.
- `enumerate` te da índice + valor; `zip` empareja elementos de dos iterables. Ambos devuelven iteradores perezosos.
Los bucles de entrenamiento ejecutan `for epoch in range(n_epochs)` — `range` controla cuántas pasadas sobre los datos. Los DataLoaders de PyTorch se consumen con `for i, (inputs, labels) in enumerate(loader)` donde `enumerate` da el índice de batch para logging. `zip(feature_names, coef_)` empareja arreglos de coeficientes de sklearn con sus nombres de columna para una tabla de importancia de características legible.
Si lo quitas: Sin `for` + `range`, no hay bucle de entrenamiento — un modelo solo podría procesar un único batch. Sin `enumerate`, el log del progreso de batches requiere un contador manual fácil de olvidar incrementar. Sin `zip`, emparejar nombres de características con pesos aprendidos requiere un slicing de índices incómodo.