Controla tus bucles en Python con break, continue y pass
Esta lección es una traducción del original en inglés.Read in EnglishAvisar de un error de traducción
Buscas el número de un amigo en una guía telefónica. Cuando lo encuentras, ¿sigues pasando todas las páginas que quedan? Claro que no: te detienes. O imagina que estás leyendo una lista de correos. Te saltas el spam y lees solo los de verdad. Son ejemplos cotidianos de controlar el flujo de un bucle.
Python te da tres instrucciones para controlar lo que pasa dentro de un bucle: break (detiene el bucle por completo), continue (salta a la siguiente iteración) y pass (no hace nada, solo ocupa el lugar). Esta lección cubre las tres, además del patrón for-else, tan propio de Python.
Al terminar, sabrás exactamente cuándo usar cada instrucción y cómo cambia el comportamiento de tus bucles.
¿Cómo funciona break en Python?
La instrucción break sale de inmediato del bucle en el que está. Python salta a la primera línea de código que hay después del bucle. No hay más iteraciones ni más comprobaciones de la condición: el bucle se acabó.
Piensa en break como una salida de emergencia. El bucle tiene una salida normal (la condición pasa a ser False o se acaban los elementos), pero break te permite salir antes cuando ya encontraste lo que necesitabas.
Checking Alice... Checking Bob... Checking Charlie... Found Charlie! Search complete.
Sin break, el bucle también revisaría a Diana y a Eve, un esfuerzo inútil porque ya encontramos a Charlie. La instrucción break ahorra tiempo al detenerse en cuanto el trabajo está hecho.
First even number: 8
El bucle se detiene en el 8 porque es el primer número par. Aunque el 2 también es par, el bucle nunca llega a él. Este patrón de "encontrar la primera coincidencia y parar" es uno de los usos más comunes de break.
¿Cómo funciona continue en Python?
La instrucción continue salta el resto de la iteración actual y vuelve al principio del bucle. El bucle sigue ejecutándose: pasa al siguiente elemento (o, en los bucles while, vuelve a comprobar la condición).
Si break es una salida de emergencia, continue se parece más a un botón de "saltar este". Sigues recorriendo el bucle; lo que pasa es que no quieres procesar este elemento en concreto.
1 3 5 7 9
Cuando num es par (2, 4, 6, 8, 10), continue salta el print() y pasa a la siguiente iteración. Cuando num es impar, continue no se ejecuta, así que print() se ejecuta con normalidad.
for num in range(1, 11):
if num % 2 != 0:
print(num)for num in range(1, 11):
if num % 2 == 0:
continue
print(num)Las dos versiones producen la misma salida. Para un ejemplo tan sencillo, la versión con if está bien. Pero continue brilla de verdad cuando hay muchas líneas de código después de la condición para saltar: mantiene tu código plano en lugar de muy indentado.
Recorded: 85 Skipping invalid score: -1 Recorded: 92 Skipping invalid score: 150 Recorded: 73 Recorded: 88 Skipping invalid score: -5 Recorded: 100 Average of 5 valid scores: 87.6
Aquí, continue funciona como un filtro. Las notas no válidas (negativas o mayores que 100) se saltan, así que las líneas del cálculo nunca se ejecutan para ellas. Solo las notas válidas se suman al total. Es más limpio que envolver todo el código de procesamiento en un gran bloque if.
¿Qué hace pass en Python?
La instrucción pass no hace absolutamente nada. Es un marcador de posición que dice: "sé que aquí hace falta código, pero todavía no lo escribí". Python exige al menos una instrucción en cualquier bloque (después de if, for, while, de la definición de una función, etc.), y pass cumple ese requisito.
Piensa en pass como un cartel de "pendiente" (un "TODO", como dicen los programadores) en una obra en construcción. El edificio aún no está terminado, pero la estructura ya está en pie. Les indica tanto a Python como a otros programadores que ese hueco está vacío a propósito.
Loop finished (nothing happened yet)
Sin pass, Python lanzaría un IndentationError, porque espera un bloque indentado después de cada dos puntos. La instrucción pass cumple ese requisito sin hacer nada.
HelloWorld
En este ejemplo, pass deja claro que ignoramos a propósito los caracteres que no son letras. Podrías quitar el else: pass por completo y el programa funcionaría igual, pero incluirlo comunica tu intención a quien lea el código.
¿Qué es el patrón for-else en Python?
Python tiene algo que la mayoría de los lenguajes no tiene: puedes añadir un bloque else a un bucle for o while. El bloque else solo se ejecuta si el bucle terminó con normalidad, es decir, si NO lo interrumpió un break.
Al principio confunde, porque else suele significar "si la condición era False". Pero en los bucles, piénsalo como "si no hubo break". Si el bucle completa todas sus iteraciones sin llegar a un break, se ejecuta el else.
Found 9!
El bucle encontró el 9, así que se ejecutó break y el bloque else se saltó. El else solo se ejecuta cuando el bucle termina sin pasar por un break.
6 was not found.
Esta vez el bucle revisó todos los números y nunca encontró el 6. Como break no llegó a ejecutarse, se ejecutó el bloque else. Esto sustituye el patrón habitual de usar una bandera booleana como found = False.
found = False
for num in numbers:
if num == target:
print(f"Found {target}!")
found = True
break
if not found:
print(f"{target} not found.")for num in numbers:
if num == target:
print(f"Found {target}!")
break
else:
print(f"{target} not found.")La versión con for-else elimina la necesidad de la bandera found. Es una forma más pythónica de resolver los patrones de "buscar e informar".
Casos de uso reales de break, continue y pass
Veamos cómo funcionan juntas estas tres instrucciones en un ejemplo más realista. Este código procesa un lote de pedidos y maneja distintas situaciones.
Processing order #1: Laptop Processing order #4: Monitor System halt received. Stopping.
El pedido #1 (Laptop) está pendiente, así que se procesa. El pedido #2 (Mouse) ya se envió, así que continue lo salta. El pedido #3 (Keyboard) está cancelado, así que también se salta. El pedido #4 (Monitor) está pendiente, así que se procesa. El pedido #5 es una orden STOP, así que break termina el bucle por completo. Al pedido #6 nunca se llega.
Este es el patrón típico: break para las condiciones de "detenerlo todo", continue para las de "saltar este", y el resto del cuerpo del bucle para el procesamiento normal.
Ejercicios de práctica
¡Es hora de practicar el control del flujo de los bucles! Estos ejercicios pondrán a prueba si sabes cuándo usar break, continue y el patrón for-else.
Fíjate bien en lo que pide cada ejercicio. Usar break cuando necesitas continue (o al revés) es un error habitual.
Usa un bucle for con break para encontrar e imprimir el primer número negativo de la lista. Imprime "Found: " seguido del número.
Salida esperada:
Found: -3Usa un bucle for con continue para imprimir todos los caracteres de la cadena "beautiful", pero salta las vocales (a, e, i, o, u). Imprime cada consonante en la misma línea usando end="".
Salida esperada:
btflNo olvides añadir un print() vacío al final para terminar con un salto de línea limpio.
Sin ejecutar el código, predice exactamente lo que va a imprimir. Sigue cada iteración y piensa en cuándo se activan continue y break.
Después, ejecútalo para comprobar tu respuesta.
Este código debería sumar los números de la lista hasta encontrar un número negativo, y entonces parar. Pero alguien usó continue en lugar de break. Corrige el error para que imprima:
Sum before negative: 15No cambies nada salvo la palabra clave equivocada.
Usa el patrón for-else para comprobar si una contraseña contiene al menos un dígito. Recorre cada carácter de la contraseña. Si encuentras un dígito, imprime "Password accepted" y sal con break. Si el bucle termina sin encontrar ningún dígito, imprime "Password must contain a number".
Salida esperada para la contraseña dada:
Password acceptedResumen: break, continue y pass
Esta es una referencia rápida de las tres instrucciones de control de bucles:
| Instrucción | Qué hace | Cuándo usarla |
|---|---|---|
break | Sale del bucle de inmediato | Encontraste lo que buscabas o se cumplió una condición de parada |
continue | Salta a la siguiente iteración | El elemento actual no necesita procesarse |
pass | No hace nada (marcador de posición) | Bloque vacío que completarás más adelante |
for-else | else se ejecuta si no hubo break | Búsquedas: "lo encontré" frente a "no lo encontré" |
Reglas clave para recordar:
break detiene el bucle ENTERO, no solo una iteracióncontinue salta solo la iteración ACTUAL: el bucle sigue adelantepass es solo un marcador de posición: no hace nada en absolutobreak solo sale del bucle más interiorelse de for-else se ejecuta cuando el bucle termina SIN un breakcontinue (salta uno) con break (detiene todo)¿Qué sigue?
Ya sabes controlar el flujo de los bucles con precisión. A continuación: [Bucles anidados en Python](/python/python-nested-loops), donde aprenderás a poner bucles dentro de bucles para trabajar con cuadrículas, combinaciones y datos multidimensionales. Los bucles anidados, combinados con break y continue, abren la puerta a patrones muy potentes.