lección 4
Repetir sin aburrirse: bucles for y while
Los bucles permiten repetir acciones sin copiar y pegar código. La diferencia entre escribir 100 líneas o escribir 3.
⏱ 55 min
Imagina que tu jefe te pide: "envía un email de bienvenida a los 500 nuevos usuarios que se registraron hoy". ¿Vas a escribir 500 veces la instrucción de enviar email? Obviamente no. Los bucles son la tercera superpotencia de la programación (después de la secuencia y la decisión): permiten repetir una acción tantas veces como necesites escribiéndola UNA sola vez. Es la diferencia entre un artesano que clava 1000 clavos a mano y una máquina que los clava automáticamente.
### La metáfora: la lavadora
Una lavadora es un bucle perfecto. Tiene un programa (centrifugado, enjuague, etc.) que REPITE durante un tiempo determinado. "Gira el tambor 800 veces por minuto durante 10 minutos." No hay un ingeniero dentro girándolo a mano 8000 veces — hay una instrucción simple que se repite. Hay dos tipos de lavadora: una que gira un número fijo de veces (bucle for — "haz esto 10 veces") y otra que gira hasta que se cumple una condición (bucle while — "gira hasta que la ropa esté seca").
### El bucle for: "haz esto para cada elemento"
El bucle for en Python es elegante: "para cada cosa en esta colección, haz algo con esa cosa". La colección más simple es un rango de números generado con range(). range(5) genera los números 0, 1, 2, 3, 4 (empieza en 0 y termina ANTES del número que le dices).
1# Bucle for básico: contar del 0 al 42for i in range(5):3 print(f"Iteración número {i}")45# Resultado:6# Iteración número 07# Iteración número 18# Iteración número 29# Iteración número 310# Iteración número 41112# range(inicio, fin) — desde inicio hasta fin-113for numero in range(1, 11):14 print(f"{numero} x 7 = {numero * 7}")1516# range(inicio, fin, paso) — de 2 en 217for par in range(0, 20, 2):18 print(par, end=" ") # 0 2 4 6 8 10 12 14 16 18
range(n) genera n números empezando en 0. range(a, b) va de a hasta b-1. range(a, b, c) salta de c en c.
Pero for no es solo para números. Puedes iterar sobre cualquier colección — por ejemplo, una lista de nombres:
1# Iterar sobre una lista de elementos2frutas = ["manzana", "banana", "cereza", "dátil"]34for fruta in frutas:5 print(f"Me gusta la {fruta}")67# Ejemplo práctico: enviar emails (simulado)8usuarios = ["ana@mail.com", "bob@mail.com", "carlos@mail.com"]910for email in usuarios:11 print(f"Enviando bienvenida a {email}...")12 print(f" ✓ Email enviado a {email}")1314print(f"Proceso completado: {len(usuarios)} emails enviados")
for variable in lista recorre cada elemento de la lista, uno por uno.
### El bucle while: "repite hasta que..."
while es diferente: no sabe de antemano cuántas veces va a repetir. Simplemente comprueba una condición ANTES de cada vuelta. Si la condición es True, ejecuta el bloque. Si es False, sale del bucle. Es como un guardia de seguridad que te deja seguir entrando mientras tengas pase válido.
1# while: repetir mientras la condición sea True2password_correcta = "secreto123"3intentos = 045password = input("Introduce la contraseña: ")67while password != password_correcta:8 intentos = intentos + 19 if intentos >= 3:10 print("¡Demasiados intentos! Cuenta bloqueada.")11 break # 'break' sale del bucle inmediatamente12 print(f"Incorrecta. Te quedan {3 - intentos} intentos.")13 password = input("Introduce la contraseña: ")1415if password == password_correcta:16 print("¡Acceso concedido! Bienvenido.")
while repite mientras la condición sea True. break fuerza la salida del bucle.
PELIGRO: el bucle infinito. Si la condición del while NUNCA se vuelve False, tu programa se queda girando eternamente (como una lavadora que nunca para). while True: sin un break dentro es un bucle infinito. Si al ejecutar en el navegador la pestaña se queda "colgada", probablemente tienes un bucle infinito: recarga la página y revisa que la condición del while pueda volverse False en algún momento. (Cuando en la Skill 3 ejecutes desde la terminal, la parada de emergencia será Ctrl+C.)
### ¿for o while? Cuándo usar cada uno
- USA FOR cuando sabes cuántas veces repetir: "haz esto 10 veces", "para cada usuario en la lista", "para cada número del 1 al 100".
- USA WHILE cuando NO sabes cuántas veces: "pide la contraseña hasta que sea correcta", "lee datos hasta que el usuario escriba salir", "intenta conectar hasta que funcione".
- En la duda, usa for. Es más seguro (no puedes crear un bucle infinito accidentalmente con for).
### Acumuladores: construir un resultado durante el bucle
Uno de los patrones más útiles con bucles es el ACUMULADOR: una variable que empieza en 0 (o vacía) y va creciendo en cada vuelta del bucle. Es como un cerdito hucha — cada vuelta metes una moneda y al final cuentas el total.
1# Patrón acumulador: sumar gastos2gastos = [12.50, 8.99, 45.00, 3.20, 22.15]34total = 0 # El acumulador empieza en 056for gasto in gastos:7 total = total + gasto8 print(f" + {gasto:.2f}€ → Acumulado: {total:.2f}€")910print(f"Total de gastos: {total:.2f}€")1112# Otro ejemplo: contar cuántos aprobados hay13notas = [7.5, 4.2, 9.0, 3.8, 6.1, 8.4, 5.0]14aprobados = 015suspensos = 01617for nota in notas:18 if nota >= 5:19 aprobados = aprobados + 120 else:21 suspensos = suspensos + 12223print(f"Aprobados: {aprobados}, Suspensos: {suspensos}")
El acumulador es una variable que crece en cada iteración. Patrón fundamental en programación.
Consejo de senior: el patrón acumulador es el 90% de lo que harás con bucles en tu carrera. Sumar totales, contar ocurrencias, construir listas, concatenar texto... todo sigue el mismo patrón: inicializar → iterar → acumular → resultado. Graba esto a fuego.
### Ejemplo completo: el cajero automático
1# Mini cajero automático con bucle2saldo = 1000.003print("=== CAJERO BIGDATABANK ===")4print(f"Saldo actual: {saldo:.2f}€")56opcion = ""7while opcion != "salir":8 print("")9 print("Opciones: consultar / retirar / ingresar / salir")10 opcion = input("¿Qué deseas hacer? ")1112 if opcion == "consultar":13 print(f"Tu saldo es: {saldo:.2f}€")14 elif opcion == "retirar":15 cantidad = float(input("¿Cuánto quieres retirar? "))16 if cantidad > saldo:17 print("¡Saldo insuficiente!")18 else:19 saldo = saldo - cantidad20 print(f"Retirados {cantidad:.2f}€. Nuevo saldo: {saldo:.2f}€")21 elif opcion == "ingresar":22 cantidad = float(input("¿Cuánto quieres ingresar? "))23 saldo = saldo + cantidad24 print(f"Ingresados {cantidad:.2f}€. Nuevo saldo: {saldo:.2f}€")25 elif opcion == "salir":26 print("¡Hasta luego! Recoge tu tarjeta.")27 else:28 print("Opción no reconocida. Intenta de nuevo.")
Combina while (menú que se repite), if/elif (decisiones) y variables (saldo que cambia). ¡Esto ya es un programa de verdad!
### Resumen
- for recorre una colección o un rango de números. Sabes cuántas veces se repite.
- while repite mientras una condición sea True. No sabes cuántas veces de antemano.
- range(n) genera números del 0 al n-1. range(a, b) va de a hasta b-1.
- break sale del bucle inmediatamente.
- El patrón acumulador: inicializar variable → iterar → acumular → resultado.
- CUIDADO con bucles infinitos: asegúrate de que la condición del while eventualmente sea False.
## ejercicios
Tabla de multiplicar personalizada
Pide al usuario un número y muestra su tabla de multiplicar del 1 al 10 con formato bonito. Bonus: pide también hasta qué número quiere la tabla.
Contador de vocales en una frase
Pide una frase al usuario y cuenta cuántas vocales (a, e, i, o, u) tiene. Muestra el conteo de cada vocal y el total. Pista: puedes recorrer un texto letra a letra con for letra in texto.
Juego: adivina el número
El programa "piensa" un número secreto (ponlo fijo, ej: 42). El usuario tiene que adivinarlo. En cada intento, el programa dice "más alto" o "más bajo". Usa while para repetir hasta que acierte. Cuenta los intentos.
Simulador de ahorro mensual
El usuario dice cuánto puede ahorrar al mes y cuánto necesita ahorrar en total (ej: para un viaje de 3000€). El programa simula mes a mes hasta alcanzar el objetivo, mostrando el progreso.
Regístrate para guardar tu progreso.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...