Skip to content

📙 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) y while (repito hasta que…).
  • Evitar el bucle infinito y usar break/continue para 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 2

Anatomí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 el i += 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?

forwhile
Cuándocuántas vueltas o tengo una colecciónRepito hasta que pase algo (no sé cuántas)
Recorrelistas, 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 while en vez de for?" → 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 True necesita un break (o un return) 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 con Ctrl + 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, 9
  • break → sale del while.
  • continue → vuelve a comprobar la condición sin ejecutar el resto del bloque.

📌 Ojo con continue en while: asegúrate de cambiar el contador antes del continue, 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 while largo (o while True) dentro de un callback de botón. Bloquea el mainloop y la ventana se congela ("no responde"). El mainloop es el while de la app; tú solo respondes a eventos.

Dónde usas while en una app:

CasoEjemplo
Validar/normalizar datoslimpiar 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 usa while a propósito para que veas el contador manual; en la práctica, for letra in texto gana.


🗄️ 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 + break al é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 += 1

Ejercicio 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 = 105

Ejercicio 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 vuelve False.

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 mainloop y la ventana se congela. El mainloop ya 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

➡️ Siguiente

Clase 04 · Diccionarios — la estructura más usada de Python (y la base de una fila de BD).