Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Control de Bucles: Comandos Especiales para tus Robots

🧭 Navegación:

¡Bienvenido al centro de control avanzado de tu almacén! Ahora que conoces a tus robots trabajadores (bucles for y while), es momento de aprender los comandos especiales que te permiten controlar su comportamiento con mayor precisión.

Los comandos de control de bucles son como el control remoto de tus robots, permitiéndote detenerlos, hacer que salten tareas o ejecuten acciones especiales cuando terminan su trabajo.

El control remoto de tus robots 🎮

Imagínate que tienes un control remoto para tus robots con botones especiales:

  • Botón BREAK: Detiene completamente al robot y lo saca del bucle
  • Botón CONTINUE: Hace que el robot salte a la siguiente iteración
  • Botón ELSE: Programa una acción especial para cuando el robot termine su trabajo normalmente
# El control remoto en acción
productos = ["laptop", "mouse", "teclado", "monitor", "impresora"]
producto_agotado = "teclado"

print("🔍 VERIFICACIÓN DE INVENTARIO")
print("=" * 30)

# El robot verifica cada producto
for producto in productos:
    print(f"Verificando: {producto}")
    
    # Si encontramos el producto agotado, detenemos la verificación
    if producto == producto_agotado:
        print(f"❌ ¡{producto} está agotado!")
        print("🛑 Deteniendo verificación para hacer un pedido urgente")
        break
    
    print(f"✅ {producto} disponible en inventario")
    print()

print("Verificación finalizada")

🔍 Mi perspectiva personal: Siempre pienso en break y continue como “palancas de emergencia” que deben usarse estratégicamente. Son herramientas poderosas, pero si abusas de ellas, tu código puede volverse difícil de seguir. Uso break cuando encuentro exactamente lo que estaba buscando y no tiene sentido seguir iterando, y continue cuando quiero saltar un caso especial sin anidar más condiciones.

El comando break: Detener el bucle inmediatamente

El comando break detiene la ejecución del bucle y continúa con el código que sigue después del bucle:

Ejemplo con for:

# ================================
# BÚSQUEDA DE PRODUCTO ESPECÍFICO
# ================================

productos = ["laptop", "mouse", "teclado", "tablet", "monitor"]
producto_buscado = "tablet"

print("🔍 BÚSQUEDA DE PRODUCTO")
print("=" * 25)

for i, producto in enumerate(productos):
    print(f"Revisando posición {i}: {producto}")
    
    if producto == producto_buscado:
        print(f"✅ ¡Producto encontrado: {producto}!")
        print(f"   Ubicación: Estante {i+1}")
        print("🛑 Deteniendo búsqueda")
        break  # Salir del bucle inmediatamente
    
    print("   ⏭️ Continuando búsqueda...")

print("🔚 Búsqueda terminada")

Ejemplo con while:

# ================================
# SISTEMA DE AUTENTICACIÓN
# ================================

contraseña_correcta = "python123"
intentos_maximos = 3
intentos = 0

print("🔐 SISTEMA DE AUTENTICACIÓN")
print("=" * 30)

# Simular diferentes intentos
contraseñas_simuladas = ["clave123", "python", "python123"]

while intentos < intentos_maximos:
    # Simular entrada del usuario
    contraseña = contraseñas_simuladas[intentos]
    intentos += 1
    
    print(f"Intento #{intentos}: {contraseña}")
    
    if contraseña == contraseña_correcta:
        print("✅ Acceso concedido")
        print("🏠 Bienvenido al sistema")
        break  # Salir del bucle si la contraseña es correcta
    
    print("❌ Contraseña incorrecta")
    print(f"Intentos restantes: {intentos_maximos - intentos}")
    print()

if intentos == intentos_maximos and contraseña != contraseña_correcta:
    print("🚫 Demasiados intentos fallidos")
    print("🔒 Cuenta bloqueada temporalmente")

print("🔚 Proceso de autenticación terminado")

El comando continue: Saltar a la siguiente iteración

El comando continue salta el resto del código en la iteración actual y pasa a la siguiente iteración:

Ejemplo con for:

# ================================
# PROCESADOR DE PEDIDOS
# ================================

pedidos = [
    {"id": 1, "estado": "pendiente", "total": 500},
    {"id": 2, "estado": "cancelado", "total": 300},
    {"id": 3, "estado": "pendiente", "total": 800},
    {"id": 4, "estado": "cancelado", "total": 150},
    {"id": 5, "estado": "pendiente", "total": 1200}
]

print("📋 PROCESADOR DE PEDIDOS PENDIENTES")
print("=" * 40)

total_procesado = 0

for pedido in pedidos:
    print(f"Revisando pedido #{pedido['id']}")
    
    # Saltar pedidos cancelados
    if pedido["estado"] == "cancelado":
        print("   ❌ Pedido cancelado - Saltando")
        continue  # Ir al siguiente pedido
    
    # Este código solo se ejecuta para pedidos no cancelados
    print(f"   ✅ Procesando pedido por ${pedido['total']}")
    total_procesado += pedido["total"]
    print(f"   📦 Pedido #{pedido['id']} completado")
    print()

print("📊 RESUMEN:")
print(f"Total procesado: ${total_procesado}")

Ejemplo con while:

# ================================
# VALIDADOR DE ENTRADAS
# ================================

print("🔢 VALIDADOR DE ENTRADAS NUMÉRICAS")
print("=" * 35)

# Simular diferentes entradas del usuario
entradas_simuladas = ["abc", "123", "-5", "0", "42"]
indice = 0

# En un programa real, usaríamos input() en un bucle while True
while indice < len(entradas_simuladas):
    # Simular entrada del usuario
    entrada = entradas_simuladas[indice]
    indice += 1
    
    print(f"Procesando entrada: '{entrada}'")
    
    # Validar que sea un número
    if not entrada.lstrip('-').isdigit():
        print("   ❌ Error: Debe ingresar un número")
        print("   ⏭️ Saltando al siguiente intento")
        continue
    
    # Convertir a entero
    numero = int(entrada)
    
    # Validar que sea positivo
    if numero <= 0:
        print("   ❌ Error: El número debe ser positivo")
        print("   ⏭️ Saltando al siguiente intento")
        continue
    
    # Si llegamos aquí, la entrada es válida
    print(f"   ✅ Entrada válida: {numero}")
    print(f"   📊 El cuadrado de {numero} es {numero ** 2}")
    print()

print("🔚 Proceso de validación terminado")

La cláusula else en bucles: Acción al completar

Python permite añadir una cláusula else a los bucles for y while. El código en el bloque else se ejecuta cuando el bucle termina normalmente (sin break):

Ejemplo con for:

# ================================
# VERIFICADOR DE CALIDAD
# ================================

productos = ["laptop", "mouse", "teclado", "monitor", "auriculares"]
umbral_calidad = 8
calidades = [9, 8, 7, 9, 9]  # Calificaciones de 1 a 10

print("🔍 VERIFICADOR DE CALIDAD")
print("=" * 30)

# Verificar la calidad de cada producto
for i, producto in enumerate(productos):
    calidad = calidades[i]
    print(f"Verificando {producto}: calidad {calidad}/10")
    
    if calidad < umbral_calidad:
        print(f"❌ {producto} no cumple el estándar mínimo de calidad")
        print("🛑 Deteniendo verificación - Se requiere revisión")
        break
    
    print(f"✅ {producto} aprobado")
    print()
else:
    # Este bloque se ejecuta si el bucle termina normalmente (sin break)
    print("🎉 ¡Todos los productos cumplen con el estándar de calidad!")
    print("📦 Lote aprobado para distribución")

print("🔚 Verificación finalizada")

Ejemplo con while:

# ================================
# MONITOR DE TEMPERATURA
# ================================

print("🌡️ MONITOR DE TEMPERATURA")
print("=" * 30)

# Simular lecturas de temperatura
temperaturas = [22, 23, 24, 25, 26]
umbral_alerta = 30
indice = 0

# Monitorear mientras haya lecturas disponibles
while indice < len(temperaturas):
    temperatura = temperaturas[indice]
    indice += 1
    
    print(f"Lectura #{indice}: {temperatura}°C")
    
    if temperatura >= umbral_alerta:
        print(f"⚠️ ¡Alerta! Temperatura por encima del umbral: {temperatura}°C")
        print("🛑 Activando sistema de enfriamiento")
        break
    
    print("✅ Temperatura normal")
    print()
else:
    # Este bloque se ejecuta si el bucle termina sin break
    print("📊 Monitoreo completo: Todas las temperaturas están dentro del rango normal")
    print("✅ No se requieren acciones adicionales")

print("🔚 Monitoreo finalizado")

Combinando break, continue y else

Puedes combinar estos comandos para crear lógicas de control sofisticadas:

# ================================
# SISTEMA DE PROCESAMIENTO DE ARCHIVOS
# ================================

archivos = [
    {"nombre": "datos.csv", "tamaño": 1024, "corrupto": False},
    {"nombre": "imagen.jpg", "tamaño": 2048, "corrupto": False},
    {"nombre": "documento.pdf", "tamaño": 3072, "corrupto": True},
    {"nombre": "video.mp4", "tamaño": 4096, "corrupto": False},
    {"nombre": "audio.mp3", "tamaño": 5120, "corrupto": False}
]

tamaño_maximo = 4000
total_procesado = 0

print("📁 SISTEMA DE PROCESAMIENTO DE ARCHIVOS")
print("=" * 40)

for archivo in archivos:
    nombre = archivo["nombre"]
    tamaño = archivo["tamaño"]
    corrupto = archivo["corrupto"]
    
    print(f"Procesando: {nombre}")
    
    # Verificar si el archivo está corrupto
    if corrupto:
        print(f"   ❌ Archivo corrupto: {nombre}")
        print("   ⚠️ Se requiere intervención manual")
        print("   🛑 Deteniendo procesamiento")
        break
    
    # Verificar tamaño del archivo
    if tamaño > tamaño_maximo:
        print(f"   ⚠️ Archivo demasiado grande: {tamaño} KB")
        print("   ⏭️ Saltando al siguiente archivo")
        continue
    
    # Procesar archivo
    print(f"   ✅ Procesando archivo: {nombre} ({tamaño} KB)")
    total_procesado += tamaño
    print(f"   📊 Total procesado: {total_procesado} KB")
    print()
else:
    print("🎉 ¡Todos los archivos han sido procesados correctamente!")
    print(f"📊 Total de datos procesados: {total_procesado} KB")

print("🔚 Procesamiento finalizado")

Bucles anidados y control de flujo

El control de flujo se vuelve especialmente útil en bucles anidados:

# ================================
# BUSCADOR DE PRODUCTOS EN ALMACENES
# ================================

almacenes = [
    {"nombre": "Central", "productos": ["laptop", "tablet", "smartphone"]},
    {"nombre": "Norte", "productos": ["monitor", "teclado", "mouse"]},
    {"nombre": "Sur", "productos": ["impresora", "scanner", "tablet"]}
]

producto_buscado = "tablet"
encontrado = False

print("🔍 BUSCADOR DE PRODUCTOS EN ALMACENES")
print("=" * 40)
print(f"Buscando: {producto_buscado}")
print()

# Buscar en cada almacén
for almacen in almacenes:
    nombre_almacen = almacen["nombre"]
    productos = almacen["productos"]
    
    print(f"Buscando en Almacén {nombre_almacen}:")
    
    # Buscar en los productos de este almacén
    for i, producto in enumerate(productos):
        print(f"   Revisando producto #{i+1}: {producto}")
        
        if producto == producto_buscado:
            print(f"   ✅ ¡Producto encontrado en Almacén {nombre_almacen}!")
            encontrado = True
            break  # Salir del bucle interno
    
    print(f"   Búsqueda en Almacén {nombre_almacen} completada")
    print()
    
    if encontrado:
        break  # Salir del bucle externo si ya encontramos el producto

if encontrado:
    print(f"🎯 {producto_buscado} encontrado. Búsqueda exitosa.")
else:
    print(f"❌ {producto_buscado} no encontrado en ningún almacén.")

print("🔚 Búsqueda finalizada")

Patrones avanzados de control de bucles

Patrón: Búsqueda con bandera

# ================================
# BUSCADOR CON BANDERA
# ================================

datos = [10, 25, 3, 8, 42, 15, 7]
objetivo = 42
encontrado = False  # Bandera

print("🔍 BUSCADOR CON BANDERA")
print("=" * 25)
print(f"Buscando: {objetivo}")
print(f"En datos: {datos}")
print()

# Buscar el objetivo
for i, valor in enumerate(datos):
    print(f"Revisando posición {i}: {valor}")
    
    if valor == objetivo:
        encontrado = True  # Activar la bandera
        posicion = i
        break

# Usar la bandera para determinar el resultado
if encontrado:
    print(f"✅ Valor {objetivo} encontrado en posición {posicion}")
else:
    print(f"❌ Valor {objetivo} no encontrado")

print("🔚 Búsqueda finalizada")

Patrón: Bucle y medio

# ================================
# PATRÓN DE BUCLE Y MEDIO
# ================================

print("🔄 PATRÓN DE BUCLE Y MEDIO")
print("=" * 25)

# Simular entrada de usuario
entradas_simuladas = ["", "0", "negativo", "-5", "10"]
indice = 0

# Bucle externo que se repite hasta obtener una entrada válida
while True:
    # Simular entrada del usuario
    if indice >= len(entradas_simuladas):
        break
    
    entrada = entradas_simuladas[indice]
    indice += 1
    
    print(f"Procesando entrada: '{entrada}'")
    
    # Validar que no esté vacía
    if not entrada:
        print("   ❌ Error: La entrada no puede estar vacía")
        continue
    
    # Validar que sea un número
    try:
        numero = int(entrada)
    except ValueError:
        print("   ❌ Error: Debe ingresar un número")
        continue
    
    # Validar que sea positivo
    if numero <= 0:
        print("   ❌ Error: El número debe ser positivo")
        continue
    
    # Si llegamos aquí, la entrada es válida
    print(f"   ✅ Entrada válida: {numero}")
    break  # Salir del bucle con una entrada válida

print("🔚 Proceso de validación terminado")

Buenas prácticas para el control de bucles

1. Usa break con moderación:

# ❌ ABUSO DE BREAK
for item in lista:
    if condicion1:
        break
    if condicion2:
        break
    if condicion3:
        break
    # Código...

# ✅ MÁS CLARO
for item in lista:
    if condicion1 or condicion2 or condicion3:
        break
    # Código...

2. Prefiere continue sobre if anidados:

# ❌ MUCHOS IFS ANIDADOS
for item in lista:
    if condicion_valida:
        if otra_condicion_valida:
            if tercera_condicion_valida:
                # Código...

# ✅ MÁS PLANO CON CONTINUE
for item in lista:
    if not condicion_valida:
        continue
    if not otra_condicion_valida:
        continue
    if not tercera_condicion_valida:
        continue
    # Código...

3. Usa else para casos de éxito:

# Buscar un elemento
for item in lista:
    if item == objetivo:
        print("Encontrado")
        break
else:
    print("No encontrado")  # Se ejecuta si no se encontró el objetivo

4. Evita bucles anidados profundos:

# ❌ DIFÍCIL DE SEGUIR
for a in lista_a:
    for b in lista_b:
        for c in lista_c:
            for d in lista_d:
                # Código...

# ✅ EXTRAER A FUNCIONES
def procesar_listas_c_d(a, b):
    for c in lista_c:
        for d in lista_d:
            # Código...

for a in lista_a:
    for b in lista_b:
        procesar_listas_c_d(a, b)

Comprueba tu comprensión 🧠

  1. ¿Cuál es la diferencia entre break y continue?

  2. ¿Qué imprimirá el siguiente código?

    for i in range(5):
        if i == 3:
            continue
        print(i, end=" ")
    
  3. ¿Cuándo se ejecuta el bloque else de un bucle?

  4. ¿Qué imprimirá este código?

    for i in range(3):
        if i == 10:
            break
        print(i, end=" ")
    else:
        print("Fin", end=" ")
    

Soluciones

  1. Diferencia entre break y continue:

    • break: Termina completamente el bucle y continúa con el código después del bucle.
    • continue: Salta el resto del código en la iteración actual y pasa a la siguiente iteración del bucle.
  2. El código imprimirá: 0 1 2 4

    Explicación: Cuando i es igual a 3, la instrucción continue hace que se salte el print() y se pase a la siguiente iteración. Por lo tanto, se imprimen todos los números del 0 al 4 excepto el 3.

  3. El bloque else de un bucle se ejecuta cuando el bucle termina normalmente, es decir, cuando se han completado todas las iteraciones sin encontrar una instrucción break. Si el bucle termina debido a un break, el bloque else no se ejecuta.

  4. El código imprimirá: 0 1 2 Fin

    Explicación: El bucle itera sobre los valores 0, 1 y 2, imprimiendo cada uno. La condición if i == 10 nunca se cumple, por lo que el break nunca se ejecuta. Como el bucle termina normalmente (sin break), se ejecuta el bloque else que imprime “Fin”.

Ejercicio práctico: Sistema de procesamiento de pedidos

# ================================
# SISTEMA DE PROCESAMIENTO DE PEDIDOS
# ================================

pedidos = [
    {"id": 101, "cliente": "Ana García", "productos": ["laptop", "mouse"], "pagado": True},
    {"id": 102, "cliente": "Carlos López", "productos": [], "pagado": True},
    {"id": 103, "cliente": "Elena Martínez", "productos": ["monitor", "teclado"], "pagado": False},
    {"id": 104, "cliente": "David Rodríguez", "productos": ["tablet"], "pagado": True},
    {"id": 105, "cliente": "Sofía Pérez", "productos": ["impresora", "scanner", "papel"], "pagado": True}
]

print("📦 SISTEMA DE PROCESAMIENTO DE PEDIDOS")
print("=" * 40)

pedidos_procesados = 0
pedidos_con_error = 0

# Procesar cada pedido
for pedido in pedidos:
    id_pedido = pedido["id"]
    cliente = pedido["cliente"]
    productos = pedido["productos"]
    pagado = pedido["pagado"]
    
    print(f"Procesando pedido #{id_pedido} de {cliente}")
    
    # Verificar si el pedido está vacío
    if not productos:
        print(f"   ⚠️ Error: Pedido vacío")
        print(f"   ⏭️ Saltando al siguiente pedido")
        pedidos_con_error += 1
        print()
        continue
    
    # Verificar si el pedido está pagado
    if not pagado:
        print(f"   ⚠️ Error: Pedido no pagado")
        print(f"   ⏭️ Saltando al siguiente pedido")
        pedidos_con_error += 1
        print()
        continue
    
    # Procesar productos
    print(f"   ✅ Verificando {len(productos)} productos:")
    for i, producto in enumerate(productos, 1):
        print(f"      {i}. {producto}")
    
    # Simular procesamiento exitoso
    print(f"   ✅ Pedido #{id_pedido} procesado correctamente")
    pedidos_procesados += 1
    print()
else:
    print("🎉 ¡Todos los pedidos han sido revisados!")

# Mostrar resumen
print("📊 RESUMEN DE PROCESAMIENTO:")
print(f"Pedidos procesados: {pedidos_procesados}")
print(f"Pedidos con error: {pedidos_con_error}")
print(f"Total de pedidos: {len(pedidos)}")

if pedidos_con_error == 0:
    print("✅ Procesamiento completado sin errores")
else:
    print(f"⚠️ {pedidos_con_error} pedidos requieren atención")

print("🔚 Proceso finalizado")

¡Ahora tienes el poder de controlar tus bucles con precisión! En el próximo capítulo, aprenderás patrones comunes que combinan todo lo que has aprendido para resolver problemas frecuentes en programación.


🧭 Navegación:

Capítulos de esta sección: