10 · while, break, continue y else en bucles
Ejecuta hasta que una condición falle, sal antes con break, salta datos malos con continue y domina la cláusula loop/else.
Los bucles `while` corren un número *desconocido* de iteraciones determinado en tiempo de ejecución — son la opción natural para comprobaciones de convergencia y bucles controlados por eventos.
Sin esto:
Sin `while`, no puedes implementar la terminación del descenso por gradiente (detener cuando la pérdida deja de mejorar), lógica de reintentos ni ningún bucle cuyo conteo dependa de los datos.
Usa while condición: cuando el número de iteraciones no se conoce de antemano. El cuerpo se ejecuta mientras la condición sea truthy; cuando se vuelve falsy el bucle termina y la ejecución continúa después. for es para una colección conocida; while es para una duración *desconocida`.
Python (in browser)
Dos condiciones de salida: meseta de pérdida (`abs(delta) <= tol`) O tope de seguridad (`iteration >= max_iter`). Los bucles de entrenamiento reales siempre incluyen ambas — nunca confíes solo en la convergencia.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
break sale del bucle más interno inmediatamente — el resto de esa iteración y todas las futuras se omiten. Es la herramienta correcta cuando encontraste lo que buscabas y no necesitas seguir.
Python (in browser)
`break` sale después de la primera coincidencia. Sin él, el bucle escanearía todos los checkpoints restantes innecesariamente.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
continue omite el resto de la iteración actual y salta a la siguiente. Úsalo para filtrar muestras malas en un pipeline de datos sin anidar profundamente la lógica de procesamiento dentro de un bloque if.
Python (in browser)
`val != val` es la forma Python pura de detectar `float('nan')` — NaN es el único valor que no es igual a sí mismo. En código real usarías `math.isnan(val)`, pero el truco de identidad vale la pena conocer.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
La cláusula `for/else` es intencionalmente no ejecutable aquí — léela para entender el *concepto*. El bloque `else` solo se activa cuando el bucle se agota naturalmente, nunca después de un `break`.
¿Cuándo se ejecuta la cláusula `else` de un bucle `for`?
- `while cond:` corre hasta que la condición es falsy — combínalo con un tope `max_iter` de seguridad para prevenir bucles infinitos.
- `break` sale del bucle actual inmediatamente; `continue` salta a la siguiente iteración. Ambos funcionan en `for` y `while`.
- La cláusula `for/while ... else` solo corre cuando el bucle sale naturalmente (sin `break`) — es un reemplazo elegante para una bandera booleana 'found'.
La terminación del descenso por gradiente usa `while abs(loss - prev_loss) > tol and iteration < max_iter` — exactamente el patrón de dos condiciones anterior. Los callbacks de early stopping llaman a `break` dentro del bucle de épocas cuando la pérdida de validación deja de mejorar. Los pipelines de limpieza de datos usan `continue` para saltar filas corruptas sin reestructurar todo el cuerpo del bucle.
Si lo quitas: Sin `while` y `break`, el descenso por gradiente tendría que ejecutar un número fijo de pasos sin posibilidad de detenerse antes cuando se alcanza la convergencia — desperdiciando cómputo. Sin `continue`, el filtrado de outliers requiere anidar toda la lógica de procesamiento dentro de un bloque `if`, haciendo el bucle más difícil de leer y extender.