Control de Bucles: Comandos Especiales para tus Robots
🧭 Navegación:
- Anterior: Bucles While
- Siguiente: Patrones Comunes
¡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
ycontinue
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. Usobreak
cuando encuentro exactamente lo que estaba buscando y no tiene sentido seguir iterando, ycontinue
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 🧠
-
¿Cuál es la diferencia entre
break
ycontinue
? -
¿Qué imprimirá el siguiente código?
for i in range(5): if i == 3: continue print(i, end=" ")
-
¿Cuándo se ejecuta el bloque
else
de un bucle? -
¿Qué imprimirá este código?
for i in range(3): if i == 10: break print(i, end=" ") else: print("Fin", end=" ")
Soluciones
-
Diferencia entre
break
ycontinue
: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.
-
El código imprimirá:
0 1 2 4
Explicación: Cuando
i
es igual a 3, la instruccióncontinue
hace que se salte elprint()
y se pase a la siguiente iteración. Por lo tanto, se imprimen todos los números del 0 al 4 excepto el 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ónbreak
. Si el bucle termina debido a unbreak
, el bloqueelse
no se ejecuta. -
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 elbreak
nunca se ejecuta. Como el bucle termina normalmente (sinbreak
), se ejecuta el bloqueelse
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:
- Anterior: Bucles While
- Siguiente: Patrones Comunes
Capítulos de esta sección:
- Introducción a Estructuras de Control
- Condicionales
- Bucles For
- Bucles While
- Control de Bucles (página actual)
- Patrones Comunes
- Diagramas de Flujo
- Quiz: Estructuras de Control