Módulo 1 · Lección 16 de 59
break y continue
Salir de un bucle antes de tiempo, saltarse una vuelta, y la cláusula else de los bucles que casi nadie conoce.
La condición de un while se comprueba solo en un sitio: arriba, antes de cada vuelta. Eso a veces no encaja con lo que necesitas. Quieres parar en cuanto encuentres lo que buscabas, en medio del bloque, sin esperar a que termine la iteración. O quieres descartar una vuelta concreta y seguir con las demás.
Python tiene dos instrucciones de una sola palabra para esos dos casos.
break: salir del bucle#
break termina el bucle inmediatamente. El programa continúa por la primera línea que haya después del bloque:
contador = 1
while contador <= 10:
if contador == 4:
print("Corto aquí.")
break
print(f"Vuelta {contador}")
contador += 1
print("Fin.")Vuelta 1
Vuelta 2
Vuelta 3
Corto aquí.
Fin.La condición del while decía hasta 10, pero el bucle se ha detenido en la cuarta vuelta. Y fíjate en que no se ha ejecutado el resto del bloque: break no espera al final de la iteración, corta ahí mismo.
continue: saltar a la vuelta siguiente#
continue abandona lo que quede del bloque y vuelve arriba, a comprobar la condición otra vez. El bucle sigue vivo:
numero = 0
while numero < 10:
numero += 1
if numero % 2 == 0:
continue
print(numero)1
3
5
7
9Los pares llegan al continue y nunca alcanzan el print. Los impares se lo saltan y se imprimen.
| Instrucción | Qué hace con la iteración actual | Qué hace con el bucle |
|---|---|---|
break | La corta | Lo termina |
continue | La corta | Lo continúa por la vuelta siguiente |
El patrón while True con break#
Aquí está la razón principal por la que existe break. Recuerda el validador de la lección anterior:
edad_texto = input("Edad: ").strip()
while not edad_texto.isdigit():
print("Eso no es un número entero.")
edad_texto = input("Edad: ").strip()El input estaba escrito dos veces, con su strip() y su prompt duplicados. Si mañana cambias el texto de la pregunta tienes que acordarte de cambiarlo en los dos sitios. La versión idiomática mueve la comprobación al medio del bucle:
while True:
edad_texto = input("Edad: ").strip()
if edad_texto.isdigit():
break
print("Eso no es un número entero.")
edad = int(edad_texto)
print(f"Gracias. Has escrito {edad}.")Edad: abc
Eso no es un número entero.
Edad: 34
Gracias. Has escrito 34.Se lee como el proceso mental real: pregunta, comprueba, si vale sal, si no avisa y vuelve a preguntar. Un solo input, una sola condición y la salida exactamente donde se decide.
Memoriza esta estructura. Es la forma estándar de pedir datos en Python y la vas a escribir cientos de veces:
while True:
respuesta = input("Pregunta: ").strip()
if respuesta_es_valida:
break
print("Mensaje de error")La cláusula else de los bucles#
Esto es una particularidad de Python que sorprende incluso a quien lleva tiempo con el lenguaje: un bucle puede llevar else.
No significa lo mismo que en un if. El else de un bucle se ejecuta cuando el bucle termina de forma natural, sin haber pasado por ningún break. Si hubo break, se salta.
Sirve para un caso muy concreto: buscar algo y hacer una cosa distinta si no lo encuentras. Busquemos el primer guion bajo de un nombre de fichero:
texto = "informe_2024_final.txt"
posicion = 0
while posicion < len(texto):
if texto[posicion] == "_":
print(f"Primer guion bajo en la posición {posicion}")
break
posicion += 1
else:
print("No hay ningún guion bajo en el texto.")Primer guion bajo en la posición 7Lo encuentra, ejecuta el break y el else no se ejecuta. Ahora con un texto donde no hay nada que encontrar, sin cambiar ni una línea del bucle:
texto = "informe.txt"
posicion = 0
while posicion < len(texto):
if texto[posicion] == "_":
print(f"Primer guion bajo en la posición {posicion}")
break
posicion += 1
else:
print("No hay ningún guion bajo en el texto.")No hay ningún guion bajo en el texto.El bucle ha recorrido el texto entero, la condición se ha vuelto falsa y entonces sí entra el else.
La alternativa, si el else no te resulta legible, es una variable bandera:
encontrado = False
posicion = 0
while posicion < len(texto):
if texto[posicion] == "_":
encontrado = True
break
posicion += 1
if not encontrado:
print("No hay ningún guion bajo en el texto.")Hace lo mismo con dos líneas más. Las dos formas son correctas; usa la que entiendas de un vistazo.
Ejemplo completo#
Un control de acceso con intentos limitados, que junta break, el else del bucle y el operador condicional:
INTENTOS_MAXIMOS = 3
intentos = 0
while intentos < INTENTOS_MAXIMOS:
clave = input("Contraseña: ").strip()
if clave == "python2024":
print("Acceso concedido.")
break
intentos += 1
restantes = INTENTOS_MAXIMOS - intentos
print(f"Incorrecta. Te queda{'' if restantes == 1 else 'n'} {restantes} intento{'' if restantes == 1 else 's'}.")
else:
print("Cuenta bloqueada. Contacta con el administrador.")Contraseña: hola
Incorrecta. Te quedan 2 intentos.
Contraseña: adios
Incorrecta. Te queda 1 intento.
Contraseña: mal
Incorrecta. Te quedan 0 intentos.
Cuenta bloqueada. Contacta con el administrador.Acierta antes y el else no aparece:
Contraseña: hola
Incorrecta. Te quedan 2 intentos.
Contraseña: python2024
Acceso concedido.Esa es la utilidad del else aquí: distinguir "ha salido porque ha acertado" de "ha salido porque se le han acabado los intentos", sin ninguna variable extra.
No abuses#
break y continue son cómodos, y por eso es fácil pasarse. Un bucle con cuatro break repartidos y dos continue obliga a leerlo entero, de arriba abajo y varias veces, para saber en qué condiciones termina. La condición del while deja de significar nada.
Reglas prácticas:
- Un
breakpor bucle es lo normal. Dos, revisable. Tres, reescríbelo. - Si el
breakestá en la última línea del bloque, no hace falta: pon la condición en elwhile. - Un
continueal principio del bloque para descartar casos se lee bien. En medio del bloque, casi nunca. - Si te cuesta explicar con una frase cuándo termina tu bucle, simplifícalo.