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:
Crear ciclos
whilecon condiciones de paradaDiferenciar cuándo usar
forvswhileUsar
breakpara salir de ciclos anticipadamenteUsar
continuepara saltar iteracionesManejar errores básicos con
tryyexcept
⏱️ 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?#
dias_para_independencia = 5→ Variable inicializadawhile 5 > 0→ Verdadero, entra al cicloImprime “Faltan 5 días…”
dias_para_independencia = 4→ Actualiza variablewhile 4 > 0→ Verdadero, continúa… (repite hasta que sea 0)
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 |
|
Tienes una colección para recorrer |
|
No sabes cuántas veces repetir |
|
Dependes de una condición externa |
|
Necesitas un menú interactivo |
|
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 |
|---|---|
|
Repite mientras la condición sea verdadera |
|
Ciclo infinito (necesita |
|
Sale del ciclo inmediatamente |
|
Salta a la siguiente iteración |
|
Se ejecuta si el ciclo termina sin |
|
Maneja errores sin detener el programa |
Tabla 18.2: Resumen de conceptos del capítulo
20.9. 📖 Referencias#
Python Software Foundation. (2024). The while statement. https://docs.python.org/3/reference/compound_stmts.html#while
Python Software Foundation. (2024). Errors and Exceptions. https://docs.python.org/3/tutorial/errors.html
Barros Arana, D. (1884-1902). Historia General de Chile. Editorial Universitaria.