Saltar al contenido
Editor

Controla tus bucles en Python con break, continue y pass

Principiante20 min5 ejercicios65 XP

Esta lección es una traducción del original en inglés.Read in EnglishAvisar de un error de traducción

0/5 ejercicios

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.

Usar break para salir de un bucle antes de tiempo
# Search for a name in a list
names = ["Alice", "Bob", "Charlie", "Diana", "Eve"]
target = "Charlie"
for name in names:
print(f"Checking {name}...")
if name == target:
print(f"Found {target}!")
break
print("Search complete.")
# Output:
# Checking Alice...
# Checking Bob...
# Checking Charlie...
# Found Charlie!
# Search complete.
Salida
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.

Encontrar la primera coincidencia con break
# Find the first even number in a list
numbers = [7, 3, 11, 8, 5, 2, 9]
for num in numbers:
if num % 2 == 0:
print(f"First even number: {num}")
break
# Output:
# First even number: 8
Salida
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.

Usar continue para saltar los números pares
# Print only odd numbers from 1 to 10
for num in range(1, 11):
if num % 2 == 0:
continue # skip even numbers
print(num)
# Output:
# 1
# 3
# 5
# 7
# 9
Salida
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.

Sin continue (if anidado)
for num in range(1, 11):
    if num % 2 != 0:
        print(num)
Con continue (plano)
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.

Saltar datos no válidos con continue
# Process only valid scores, skip invalid ones
scores = [85, -1, 92, 150, 73, 88, -5, 100]
valid_count = 0
total = 0
for score in scores:
if score < 0 or score > 100:
print(f" Skipping invalid score: {score}")
continue
valid_count += 1
total += score
print(f" Recorded: {score}")
average = total / valid_count
print(f"\nAverage of {valid_count} valid scores: {average:.1f}")
# Output:
# 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
Salida
  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.

Usar pass como marcador de posición
# Skeleton code - structure first, logic later
for num in range(10):
if num % 2 == 0:
pass # TODO: handle even numbers
else:
pass # TODO: handle odd numbers
print("Loop finished (nothing happened yet)")
# Output:
# Loop finished (nothing happened yet)
Salida
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.

Usar pass para ignorar casos a propósito
# Common use: ignore specific cases
for char in "Hello, World! 123":
if char.isalpha():
print(char, end="") # print letters only
else:
pass # ignore non-letters (spaces, punctuation, digits)
print() # newline
# Output:
# HelloWorld
Salida
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.

for-else cuando SÍ se encuentra el objetivo (se ejecuta break)
# Search for a number - found case
numbers = [3, 7, 2, 9, 4]
target = 9
for num in numbers:
if num == target:
print(f"Found {target}!")
break
else:
print(f"{target} was not found.")
# Output:
# Found 9!
Salida
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.

for-else cuando NO se encuentra el objetivo (se ejecuta else)
# Search for a number - not found case
numbers = [3, 7, 2, 9, 4]
target = 6
for num in numbers:
if num == target:
print(f"Found {target}!")
break
else:
print(f"{target} was not found.")
# Output:
# 6 was not found.
Salida
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.

Sin for-else (necesita una bandera)
found = False
for num in numbers:
    if num == target:
        print(f"Found {target}!")
        found = True
        break
if not found:
    print(f"{target} not found.")
Con for-else (más limpio)
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.

break, continue y pass en acción
# Processing orders
orders = [
{"id": 1, "item": "Laptop", "status": "pending"},
{"id": 2, "item": "Mouse", "status": "shipped"},
{"id": 3, "item": "Keyboard", "status": "cancelled"},
{"id": 4, "item": "Monitor", "status": "pending"},
{"id": 5, "item": "STOP", "status": "system"},
{"id": 6, "item": "Headphones", "status": "pending"},
]
for order in orders:
# Stop processing if we hit a system command
if order["item"] == "STOP":
print("System halt received. Stopping.")
break
# Skip already-handled orders
if order["status"] in ["shipped", "cancelled"]:
continue
# Process pending orders
print(f"Processing order #{order['id']}: {order['item']}")
# Output:
# Processing order #1: Laptop
# Processing order #4: Monitor
# System halt received. Stopping.
Salida
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.

Ejercicio 1: encuentra el primer número negativo
Escribe el código

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: -3
numbers = [4, 7, 2, -3, 8, -1, 5]
# Find and print the first negative number using break
Ejercicio 2: imprime sin vocales
Escribe el código

Usa 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:

btfl

No olvides añadir un print() vacío al final para terminar con un salto de línea limpio.

word = "beautiful"
# Print each character, but skip vowels using continue
print() # newline at the end
Ejercicio 3: predice la salida
Predice la salida

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.

for i in range(1, 8):
if i == 3:
continue
if i == 6:
break
print(i)
Ejercicio 4: corrige el error de la suma hasta un negativo
Corrige el error

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: 15

No cambies nada salvo la palabra clave equivocada.

numbers = [5, 3, 7, -2, 8, 4]
total = 0
for num in numbers:
if num < 0:
continue # BUG: this should stop, not skip!
total += num
print(f"Sum before negative: {total}")
Ejercicio 5: comprobador de contraseñas con for-else
Escribe el código

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 accepted
password = "hello5world"
# Check if password contains at least one digit using for-else

Resumen: break, continue y pass

Esta es una referencia rápida de las tres instrucciones de control de bucles:

InstrucciónQué haceCuándo usarla
breakSale del bucle de inmediatoEncontraste lo que buscabas o se cumplió una condición de parada
continueSalta a la siguiente iteraciónEl elemento actual no necesita procesarse
passNo hace nada (marcador de posición)Bloque vacío que completarás más adelante
for-elseelse se ejecuta si no hubo breakBúsquedas: "lo encontré" frente a "no lo encontré"

Reglas clave para recordar:

  • break detiene el bucle ENTERO, no solo una iteración
  • continue salta solo la iteración ACTUAL: el bucle sigue adelante
  • pass es solo un marcador de posición: no hace nada en absoluto
  • En bucles anidados, break solo sale del bucle más interior
  • El else de for-else se ejecuta cuando el bucle termina SIN un break
  • No confundas continue (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.

    Tutoriales relacionados

    ¿Te sirvió este tutorial?

    Sugerir una mejora