Apariencia
📙 Clase 03 — Bucles while
Fase 1 · Estructuras de datos y bucles ⬅️ Volver al índice de clases
🎯 Qué aprendí
- Repetir un bloque mientras se cumpla una condición.
- La diferencia clave entre
for(sé cuántas vueltas) ywhile(repito hasta que…). - Evitar el bucle infinito y usar
break/continuepara controlar el flujo.
📖 PARTE TEÓRICA
🔁 1. La idea: "repite mientras…"
Un while repite su bloque mientras la condición sea verdadera. Antes de cada vuelta comprueba la condición: si es True, ejecuta; si es False, sale.
python
i = 0
while i < 3: # ¿i es menor que 3?
print("i vale", i)
i += 1 # ¡MUY importante! acercarse a que la condición sea falsa
# i vale 0
# i vale 1
# i vale 2Anatomía:
while i < 3 :
│ │
│ └── condición: mientras sea True, se repite
└───────── inicia el bucle
(dentro, algo debe cambiar para que la condición acabe siendo False)⚠️ El error #1 con
while: olvidar eli += 1. Si la condición nunca se vuelve falsa, el bucle no termina nunca (bucle infinito) y el programa se cuelga. Ver sección 4.
⚖️ 2. for vs while: ¿cuál uso?
for | while | |
|---|---|---|
| Cuándo | Sé cuántas vueltas o tengo una colección | Repito hasta que pase algo (no sé cuántas) |
| Recorre | listas, range, textos… | una condición |
| Ejemplo típico | "para cada tarea de la lista…" | "mientras la contraseña sea incorrecta…" |
python
# for: sé que son 3 frutas
for fruta in ["manzana", "pera", "uva"]:
print(fruta)
# while: no sé cuántos intentos hará el usuario
intentos = 0
while intentos < 3:
intentos += 1
print("Intento", intentos)🧪 Tip de entrevista: "¿Cuándo
whileen vez defor?" → cuando no sabes de antemano cuántas iteraciones harás: dependes de una condición (entrada del usuario, un estado que cambia, una respuesta de red…).
🔢 3. Contadores y cuenta regresiva
El patrón más común: una variable que sube o baja hasta un límite.
python
# Cuenta regresiva
n = 3
while n > 0:
print(n)
n -= 1 # baja de a 1
print("¡Despegue!")
# 3
# 2
# 1
# ¡Despegue!♾️ 4. Bucle infinito + break (patrón útil)
A veces quieres un bucle "infinito" y lo cortas por dentro con break cuando pasa algo. Es el patrón típico de "seguir pidiendo hasta que sea válido".
python
intentos = 0
while True: # "para siempre"…
intentos += 1
if intentos == 3:
print("Correcto al intento", intentos)
break # …hasta que decidimos salir⚠️
while Truenecesita unbreak(o unreturn) que se alcance, o se cuelga. Si estás en la terminal y un programa se queda pegado, probablemente es un bucle infinito: córtalo conCtrl + C.
⏭️ 5. break y continue (igual que en for)
python
n = 0
while n < 10:
n += 1
if n % 2 == 0:
continue # salta los pares
print(n) # 1, 3, 5, 7, 9break→ sale delwhile.continue→ vuelve a comprobar la condición sin ejecutar el resto del bloque.
📌 Ojo con
continueenwhile: asegúrate de cambiar el contador antes delcontinue, o te saltas la línea que lo actualiza y creas un bucle infinito.
🖥️ EN TU APP DE ESCRITORIO
En una GUI no usas while para "esperar clics" — de eso se encarga el mainloop de CustomTkinter (app.mainloop() ya es el gran bucle que espera eventos). Usar tu propio while para esperar al usuario congelaría la ventana.
⚠️ Gotcha de GUI: nunca pongas un
whilelargo (owhile True) dentro de un callback de botón. Bloquea elmainloopy la ventana se congela ("no responde"). Elmainloopes elwhilede la app; tú solo respondes a eventos.
Dónde sí usas while en una app:
| Caso | Ejemplo |
|---|---|
| Validar/normalizar datos | limpiar una cadena "mientras tenga espacios al inicio" |
| Reintentar una operación | "mientras la conexión falle y queden intentos, reintenta" |
| Procesar hasta agotar | "mientras queden ítems en la cola, procesa uno" |
python
# Validación con while: normalizar un teléfono quitando caracteres no numéricos
def solo_digitos(texto):
limpio = ""
i = 0
while i < len(texto):
if texto[i].isdigit():
limpio += texto[i]
i += 1
return limpio
print(solo_digitos("999-111-222")) # 999111222💡 Para recorrer un texto casi siempre es más limpio un
for. Este ejemplo usawhilea propósito para que veas el contador manual; en la práctica,for letra in textogana.
🗄️ CON BASE DE DATOS (caso de uso)
El patrón "reintentar mientras falle" aparece al conectar a una BD o a una API:
python
intentos = 0
while intentos < 3:
try:
con = sqlite3.connect("datos.db")
break # conectó → salimos del while
except sqlite3.Error:
intentos += 1 # falló → suma y reintenta🗄️
try/except(atrapar el error) es de la Fase 2. Aquí solo verás la forma del reintento:while+ contador +breakal éxito.
🏋️ EJERCICIOS CON SOLUCIÓN
Ejercicio 1 — Del 1 al 5
Imprime los números del 1 al 5 usando while (no for).
Ver solución
python
i = 1
while i <= 5:
print(i)
i += 1Ejercicio 2 — Suma hasta pasar 100
Empezando en 0, suma 7 repetidamente y cuenta cuántas sumas necesitas para pasar de 100.
Ver solución
python
total = 0
veces = 0
while total <= 100:
total += 7
veces += 1
print(f"Necesité {veces} sumas, total = {total}")
# Necesité 15 sumas, total = 105Ejercicio 3 — Reintentos (patrón app)
Simula que un valor clave debe llegar a "abrir". Usa while True con un break: recorre la lista intentos_usuario = ["a", "ab", "abrir"] con un índice y sal cuando aciertes.
Ver solución
python
intentos_usuario = ["a", "ab", "abrir"]
i = 0
while True:
intento = intentos_usuario[i]
if intento == "abrir":
print(f"¡Correcto al intento {i+1}!")
break
print(f"Intento {i+1}: '{intento}' incorrecto")
i += 1
# Intento 1: 'a' incorrecto
# Intento 2: 'ab' incorrecto
# ¡Correcto al intento 3!❓ Preguntas y respuestas (autoevaluación)
1. ¿Cuál es la causa más común de un bucle infinito con while?
Olvidar actualizar la variable de la condición (p. ej. no poner
i += 1), así nunca se vuelveFalse.
2. ¿Cuándo prefieres while sobre for?
Cuando no sabes cuántas iteraciones harás: repites hasta que se cumpla una condición.
3. ¿Por qué NO debes poner un while largo dentro de un botón de CustomTkinter?
Bloquea el
mainloopy la ventana se congela. Elmainloopya es el bucle de la app.
4. ¿Cómo cortas un programa colgado en un bucle infinito desde la terminal?
Con
Ctrl + C.
📎 Apuntes relacionados
- El otro bucle → Clase 02 · for
- Condiciones y truthy/falsy → Conceptos
- El
mainloopde la GUI → CustomTkinter
➡️ Siguiente
Clase 04 · Diccionarios — la estructura más usada de Python (y la base de una fila de BD).