19. Condicionales y Ciclos For: Decisiones y Repeticiones en la Historia#

“La historia no es el estudio del pasado; es el estudio del cambio. La historia nos enseña qué cosas cambian y cómo cambian, y nos ayuda a entender qué podría permanecer igual y qué podría cambiar en el futuro.”

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

19.1. 🎯 Objetivos de Aprendizaje#

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

  1. Usar estructuras condicionales (if, elif, else) para tomar decisiones

  2. Aplicar operadores de comparación y lógicos

  3. Crear ciclos for para iterar sobre datos históricos

  4. Usar la función range() para generar secuencias

  5. Combinar condicionales y ciclos en programas más complejos

⏱️ Tiempo estimado

90 minutos de lectura y práctica

19.2. Estructuras Condicionales#

Las estructuras condicionales permiten que el programa tome decisiones basadas en condiciones, igual que los historiadores evalúan evidencias antes de llegar a conclusiones.

🏛️ Analogía Histórica

Imagina que eres un historiador evaluando si un evento es anterior o posterior a cierta fecha. Si el año es menor a 1810, entonces es período colonial; si es igual a 1810, es el inicio de la Independencia; de lo contrario, es período republicano.

19.2.1. La estructura if#

# Clasificar un año histórico
anio = 1818

if anio >= 1810:
    print(f"El año {anio} pertenece al período de Independencia o posterior")
El año 1818 pertenece al período de Independencia o posterior

19.2.2. La estructura if-else#

# ¿Es período colonial o independiente?
anio = 1750

if anio < 1810:
    print(f"El año {anio} pertenece al período Colonial")
else:
    print(f"El año {anio} pertenece al período de Independencia o posterior")
El año 1750 pertenece al período Colonial

19.2.3. La estructura if-elif-else#

Para múltiples condiciones usamos elif (abreviatura de “else if”):

# Clasificar períodos de la historia de Chile
anio = 1830

if anio < 1541:
    periodo = "Precolombino"
elif anio < 1810:
    periodo = "Colonial"
elif anio < 1818:
    periodo = "Patria Vieja / Reconquista"
elif anio < 1830:
    periodo = "Patria Nueva / Organización"
elif anio < 1891:
    periodo = "República Conservadora y Liberal"
else:
    periodo = "Chile Contemporáneo"

print(f"El año {anio} corresponde al período: {periodo}")
El año 1830 corresponde al período: República Conservadora y Liberal

19.3. Operadores de Comparación#

Operador

Significado

Ejemplo

Resultado

==

Igual a

5 == 5

True

!=

Diferente de

5 != 3

True

<

Menor que

3 < 5

True

>

Mayor que

5 > 3

True

<=

Menor o igual

5 <= 5

True

>=

Mayor o igual

5 >= 3

True

Tabla 17.1: Operadores de comparación en Python

# Ejemplos con contexto histórico
anio_rancagua = 1814  # Desastre de Rancagua
anio_maipu = 1818     # Batalla de Maipú

print(f"¿Rancagua fue antes que Maipú?: {anio_rancagua < anio_maipu}")
print(f"¿Son el mismo año?: {anio_rancagua == anio_maipu}")
print(f"¿Rancagua fue en 1814?: {anio_rancagua == 1814}")
¿Rancagua fue antes que Maipú?: True
¿Son el mismo año?: False
¿Rancagua fue en 1814?: True

19.4. Operadores Lógicos#

Operador

Significado

Ejemplo

and

Y (ambas verdaderas)

x > 0 and x < 10

or

O (al menos una verdadera)

x < 0 or x > 100

not

Negación

not (x > 5)

Tabla 17.2: Operadores lógicos en Python

# Verificar si un año está en el siglo XIX
anio = 1879  # Guerra del Pacífico

# Un año está en el siglo XIX si es >= 1801 Y <= 1900
en_siglo_xix = anio >= 1801 and anio <= 1900
print(f"¿{anio} está en el siglo XIX?: {en_siglo_xix}")

# ¿Es un año de guerra importante?
es_guerra_pacifico = anio >= 1879 and anio <= 1884
es_guerra_civil = anio == 1891
en_conflicto = es_guerra_pacifico or es_guerra_civil

print(f"¿Chile estaba en conflicto en {anio}?: {en_conflicto}")
¿1879 está en el siglo XIX?: True
¿Chile estaba en conflicto en 1879?: True

19.4.1. Ejemplo: Clasificador de Edades Históricas#

# Programa que clasifica un año en su "Edad" histórica
anio = int(input("Ingresa un año de la historia: "))

if anio < -3000:
    edad = "Prehistoria"
elif anio < 476:
    edad = "Edad Antigua"
elif anio < 1453:
    edad = "Edad Media"
elif anio < 1789:
    edad = "Edad Moderna"
else:
    edad = "Edad Contemporánea"

print(f"El año {anio} pertenece a la {edad}")

19.5. El Ciclo for#

El ciclo for permite iterar (repetir) sobre una secuencia de elementos. Es como revisar uno por uno los documentos de un archivo histórico.

📋 Sintaxis básica

for elemento in secuencia:
    # código a repetir

# Iterar sobre una lista de estaciones del año
estaciones = ["Primavera", "Verano", "Otoño", "Invierno"]

print("Las estaciones del año son:")
for estacion in estaciones:
    print(f"  - {estacion}")
# Iterar sobre presidentes chilenos del siglo XX
presidentes = [
    ("Arturo Alessandri", 1920),
    ("Carlos Ibáñez", 1927),
    ("Pedro Aguirre Cerda", 1938),
    ("Salvador Allende", 1970)
]

print("Algunos presidentes del siglo XX:")
for nombre, anio in presidentes:
    print(f"  {nombre} asumió en {anio}")

19.5.1. La función range()#

La función range() genera secuencias de números:

Uso

Resultado

range(5)

0, 1, 2, 3, 4

range(2, 6)

2, 3, 4, 5

range(0, 10, 2)

0, 2, 4, 6, 8

Tabla 17.3: Usos de la función range()

# Contar del 1 al 5
print("Contando del 1 al 5:")
for i in range(1, 6):
    print(i)

print("\nDécadas del siglo XX (solo cada 10 años):")
for anio in range(1900, 2001, 10):
    print(f"Década de {anio}")

19.5.2. Iterar sobre strings#

# Contar letras en "CHILE"
palabra = "CHILE"

print(f"Letras en '{palabra}':")
for letra in palabra:
    print(f"  {letra}")

print(f"\nTotal de letras: {len(palabra)}")

19.5.3. Combinando for con condicionales#

# Filtrar años de guerra en Chile
anios = [1814, 1817, 1818, 1836, 1879, 1880, 1891, 1920, 1973]

print("Años de conflictos importantes:")
for anio in anios:
    # Guerra de Independencia (1810-1826)
    if 1810 <= anio <= 1826:
        print(f"  {anio}: Guerra de Independencia")
    # Guerra del Pacífico (1879-1884)
    elif 1879 <= anio <= 1884:
        print(f"  {anio}: Guerra del Pacífico")
    # Guerra Civil (1891)
    elif anio == 1891:
        print(f"  {anio}: Guerra Civil")

19.5.4. Ciclos anidados: Listas dentro de listas#

# Series de TV organizadas por género
series_por_genero = [
    ["Los Simpson", "Friends", "The Office"],      # Comedia
    ["Game of Thrones", "Breaking Bad", "The Wire"]  # Drama
]

generos = ["Comedia", "Drama"]

for i, genero in enumerate(generos):
    print(f"\n{genero}:")
    for serie in series_por_genero[i]:
        print(f"  - {serie} ({len(serie)} caracteres)")

19.6. 🏛️ Ejemplo Histórico: Análisis de Batallas de la Independencia#

# Base de datos de batallas de la Independencia de Chile
batallas = [
    {"nombre": "Rancagua", "anio": 1814, "resultado": "Derrota"},
    {"nombre": "Chacabuco", "anio": 1817, "resultado": "Victoria"},
    {"nombre": "Cancha Rayada", "anio": 1818, "resultado": "Derrota"},
    {"nombre": "Maipú", "anio": 1818, "resultado": "Victoria"}
]

# Análisis
victorias = 0
derrotas = 0

print("="*50)
print("BATALLAS DE LA INDEPENDENCIA DE CHILE")
print("="*50)

for batalla in batallas:
    # Emoji según resultado
    emoji = "✅" if batalla["resultado"] == "Victoria" else "❌"
    
    print(f"{emoji} {batalla['nombre']} ({batalla['anio']}): {batalla['resultado']}")
    
    # Contar resultados
    if batalla["resultado"] == "Victoria":
        victorias += 1
    else:
        derrotas += 1

print("="*50)
print(f"RESUMEN: {victorias} victorias, {derrotas} derrotas")
print(f"Tasa de éxito: {(victorias / len(batallas)) * 100:.1f}%")

19.7. 📝 Actividad de Cierre#

19.7.1. Ejercicio 1: Clasificador de Siglos#

Crea un programa que pida un año al usuario y determine a qué siglo pertenece.

# Tu código aquí
# Pista: El siglo XIX va de 1801 a 1900

19.7.2. Ejercicio 2: Contador de Vocales#

Cuenta cuántas vocales tiene el nombre “BERNARDO O’HIGGINS” usando un ciclo for.

# Tu código aquí
nombre = "BERNARDO O'HIGGINS"
vocales = "AEIOUaeiou"

19.7.3. Ejercicio 3: Años Bisiestos Históricos#

Imprime todos los años bisiestos entre 1800 y 1900 (cada 4 años, excepto los que son divisibles por 100 pero no por 400).

# Tu código aquí
# Un año es bisiesto si:
# - Es divisible por 4 Y
# - NO es divisible por 100, O es divisible por 400

19.8. 📚 Resumen del Capítulo#

Concepto

Descripción

if

Ejecuta código si la condición es verdadera

elif

Condición alternativa

else

Se ejecuta si ninguna condición anterior fue verdadera

==, !=, <, >

Operadores de comparación

and, or, not

Operadores lógicos

for x in secuencia

Itera sobre cada elemento

range(n)

Genera secuencia de 0 a n-1

Tabla 17.4: Resumen de conceptos del capítulo

19.9. 📖 Referencias#