20. Ciclo While y Control de Flujo: Repetir Hasta que la Historia Cambie#

“Los humanos piensan en historias en lugar de en hechos, números o ecuaciones, y cuanto más simple es la historia, mejor. Cada persona, grupo y nación tiene sus relatos y mitos.”

—Yuval Noah Harari, 21 lecciones para el siglo XXI (2018)

20.1. 🎯 Objetivos de Aprendizaje#

Al finalizar este capítulo, serás capaz de:

  1. Crear ciclos while con condiciones de parada

  2. Diferenciar cuándo usar for vs while

  3. Usar break para salir de ciclos anticipadamente

  4. Usar continue para saltar iteraciones

  5. Manejar errores básicos con try y except

⏱️ Tiempo estimado

80 minutos de lectura y práctica

20.2. El Ciclo while#

El ciclo while (“mientras” en inglés) repite un bloque de código mientras una condición sea verdadera.

🏛️ Analogía Histórica

Imagina el proceso de independencia de Chile: “Mientras España controle el territorio, seguiremos luchando”. El ciclo se repite hasta que la condición cambia.

20.2.1. Estructura básica#

while condición:
    # código a repetir
    # actualizar condición (¡importante!)
# Cuenta regresiva histórica: Declaración de Independencia
dias_para_independencia = 5

print("Cuenta regresiva para el 12 de febrero de 1818:")
while dias_para_independencia > 0:
    print(f"  Faltan {dias_para_independencia} días...")
    dias_para_independencia -= 1  # ¡Crucial para evitar ciclo infinito!

print("¡Chile es independiente!")

20.2.2. ¿Qué pasó paso a paso?#

  1. dias_para_independencia = 5 → Variable inicializada

  2. while 5 > 0 → Verdadero, entra al ciclo

  3. Imprime “Faltan 5 días…”

  4. dias_para_independencia = 4 → Actualiza variable

  5. while 4 > 0 → Verdadero, continúa

  6. … (repite hasta que sea 0)

  7. while 0 > 0 → Falso, sale del ciclo

⚠️ Peligro: Ciclos Infinitos

Si olvidas actualizar la variable de control, el ciclo nunca termina. Tu programa se “congela”. Siempre asegúrate de que la condición eventualmente sea falsa.

20.2.3. Ejemplo: Acumulador con while#

# Sumar los años de gobierno de los primeros 5 presidentes chilenos
anos_gobierno = [1, 1, 4, 3, 1]  # Años aproximados de cada mandato
indice = 0
suma_total = 0

while indice < len(anos_gobierno):
    suma_total += anos_gobierno[indice]
    print(f"Sumé {anos_gobierno[indice]} años, total: {suma_total}")
    indice += 1

print(f"\nTotal de años: {suma_total}")

20.3. ¿Cuándo usar for vs while?#

Situación

Usar

Sabes cuántas veces repetir

for

Tienes una colección para recorrer

for

No sabes cuántas veces repetir

while

Dependes de una condición externa

while

Necesitas un menú interactivo

while

Tabla 18.1: Guía para elegir entre for y while

# Mismo resultado, diferentes enfoques
print("Con FOR (sabemos que son 5 iteraciones):")
for i in range(5):
    print(i, end=" ")

print("\n\nCon WHILE (repetimos hasta que se cumpla condición):")
i = 0
while i < 5:
    print(i, end=" ")
    i += 1

20.4. El patrón while True con break#

A veces queremos un ciclo que se repita “para siempre” hasta que algo específico ocurra. Para esto usamos while True con break.

20.4.1. La sentencia break#

La sentencia break sale inmediatamente del ciclo, sin importar la condición.

# Simulación: Buscar un tratado de paz
anios_guerra = [1879, 1880, 1881, 1882, 1883, 1884]
anio_tratado = 1884  # Tratado de Ancón

print("Buscando el fin de la Guerra del Pacífico...")
for anio in anios_guerra:
    print(f"  Año {anio}: La guerra continúa...")
    if anio == anio_tratado:
        print(f"  ¡Se firmó el tratado en {anio}!")
        break  # Sale del ciclo inmediatamente
# Menú interactivo de Historia de Chile
print("=== ENCICLOPEDIA HISTÓRICA ===")

while True:
    print("\n¿Qué quieres saber?")
    print("1. Fecha de Independencia")
    print("2. Batalla de Maipú")
    print("3. Salir")
    
    opcion = input("Elige una opción: ")
    
    if opcion == "1":
        print("\n📅 Chile declaró su independencia el 12 de febrero de 1818.")
    elif opcion == "2":
        print("\n⚔️ La Batalla de Maipú ocurrió el 5 de abril de 1818.")
    elif opcion == "3":
        print("\n¡Hasta pronto, historiador!")
        break  # Sale del while True
    else:
        print("\n❌ Opción no válida. Intenta de nuevo.")

20.4.2. La sentencia continue#

La sentencia continue salta a la siguiente iteración del ciclo, sin ejecutar el código restante.

# Imprimir solo años de paz (no años de guerra)
anios = range(1875, 1890)
anios_guerra = [1879, 1880, 1881, 1882, 1883, 1884]  # Guerra del Pacífico

print("Años de paz en Chile (1875-1889):")
for anio in anios:
    if anio in anios_guerra:
        continue  # Salta este año (está en guerra)
    print(f"  {anio} - Año de paz")

20.4.3. El bloque else en ciclos#

Python permite agregar else a los ciclos. El bloque else se ejecuta solo si el ciclo termina normalmente (sin break).

# Buscar un rey en una lista de presidentes (no lo encontrará)
gobernantes = ["O'Higgins", "Freire", "Pinto", "Prieto"]

print("Buscando un rey en la lista de gobernantes...")
for gobernante in gobernantes:
    if gobernante.startswith("Rey"):
        print(f"¡Encontré un rey: {gobernante}!")
        break
else:
    # Se ejecuta porque el ciclo terminó sin break
    print("No se encontró ningún rey. Chile es una república.")

20.5. Manejo de Errores con try y except#

Los errores son inevitables en la programación. El manejo de errores permite que nuestro programa no se detenga cuando algo sale mal.

20.5.1. ¿Por qué es importante?#

  • El usuario puede ingresar texto cuando esperas un número

  • Puede haber una división por cero

  • Un archivo puede no existir

20.5.2. Sintaxis básica#

try:
    # código que puede fallar
except:
    # código si hay error
# Sin manejo de errores (puede fallar)
# edad = int(input("¿En qué año naciste? "))  # Si escribes "mil" falla

# Con manejo de errores
try:
    anio = int(input("¿En qué año nació Bernardo O'Higgins? "))
    print(f"Correcto si dijiste 1778. Tú ingresaste: {anio}")
except:
    print("Error: Por favor ingresa solo números.")
# Pedir un año válido hasta que lo ingrese correctamente
print("Ingresa el año de la Batalla de Maipú:")

while True:
    try:
        anio = int(input("Año: "))
        if anio == 1818:
            print("¡Correcto! La Batalla de Maipú fue en 1818.")
        else:
            print(f"Incorrecto. {anio} no es la respuesta correcta.")
        break  # Sale porque el input fue válido
    except:
        print("Por favor, ingresa un número válido. Intenta de nuevo.")

20.6. 🏛️ Ejemplo Completo: Quiz de Historia de Chile#

# Quiz interactivo de Historia de Chile
preguntas = [
    {"pregunta": "¿En qué año fue la Primera Junta de Gobierno?", "respuesta": 1810},
    {"pregunta": "¿En qué año se firmó el Acta de Independencia?", "respuesta": 1818},
    {"pregunta": "¿En qué año comenzó la Guerra del Pacífico?", "respuesta": 1879}
]

puntaje = 0

print("="*50)
print("     QUIZ DE HISTORIA DE CHILE")
print("="*50)

for i, p in enumerate(preguntas, 1):
    print(f"\nPregunta {i}: {p['pregunta']}")
    
    intentos = 3
    while intentos > 0:
        try:
            respuesta = int(input("Tu respuesta: "))
            
            if respuesta == p["respuesta"]:
                print("✅ ¡Correcto!")
                puntaje += 1
                break
            else:
                intentos -= 1
                if intentos > 0:
                    print(f"❌ Incorrecto. Te quedan {intentos} intentos.")
                else:
                    print(f"❌ La respuesta correcta era: {p['respuesta']}")
        except:
            print("⚠️ Por favor ingresa un número.")

print("\n" + "="*50)
print(f"RESULTADO FINAL: {puntaje}/{len(preguntas)} correctas")
if puntaje == len(preguntas):
    print("🏆 ¡Excelente! Eres un experto en Historia de Chile.")
elif puntaje >= len(preguntas) // 2:
    print("📚 Buen trabajo. Sigue estudiando.")
else:
    print("📖 Necesitas repasar tu historia.")

20.7. 📝 Actividad de Cierre#

20.7.1. Ejercicio 1: Cuenta Regresiva Personalizada#

Crea una cuenta regresiva desde un número ingresado por el usuario hasta 0, usando while.

# Tu código aquí

20.7.2. Ejercicio 2: Adivinador de Años#

Crea un juego donde el usuario debe adivinar en qué año ocurrió un evento histórico. Dale 5 intentos y pistas (“más alto” o “más bajo”).

# Tu código aquí
# El año a adivinar: Revolución Francesa (1789)
anio_secreto = 1789

20.7.3. Ejercicio 3: Calculadora Histórica#

Crea una calculadora que permita calcular diferencias entre años históricos. El menú debe repetirse hasta que el usuario elija salir.

# Tu código aquí

20.8. 📚 Resumen del Capítulo#

Concepto

Descripción

while condición:

Repite mientras la condición sea verdadera

while True:

Ciclo infinito (necesita break)

break

Sale del ciclo inmediatamente

continue

Salta a la siguiente iteración

else en ciclos

Se ejecuta si el ciclo termina sin break

try/except

Maneja errores sin detener el programa

Tabla 18.2: Resumen de conceptos del capítulo

20.9. 📖 Referencias#