21. Funciones con Parámetros: Organizando el Código Histórico#
“La capacidad de crear una realidad imaginada a partir de palabras permitió que un gran número de extraños cooperaran de manera efectiva. Pero también significó que el éxito o el fracaso dependía de historias, no de hechos.”
—Yuval Noah Harari, De animales a dioses (2014)
21.1. 🎯 Objetivos de Aprendizaje#
Al finalizar este capítulo, serás capaz de:
Crear funciones que reciben información (parámetros)
Usar
returnpara que las funciones devuelvan resultadosEntender la diferencia entre parámetros y argumentos
Organizar código en funciones reutilizables
Combinar funciones con todo lo aprendido anteriormente
⏱️ Tiempo estimado
90 minutos de lectura y práctica
21.2. ¿Qué son las Funciones?#
Una función es un bloque de código reutilizable que realiza una tarea específica. Las funciones nos permiten:
Organizar el código en piezas más pequeñas
Reutilizar código sin tener que escribirlo varias veces
Abstraer la complejidad (usar sin saber cómo funciona internamente)
🏛️ Analogía Histórica
Imagina que las funciones son como departamentos en un museo: el departamento de arqueología, el de arte colonial, el de historia republicana. Cada uno tiene una tarea específica, pero trabajan juntos para el objetivo del museo.
21.2.1. Función simple (sin parámetros)#
# Definir una función
def saludar_historiador():
print("¡Bienvenido al estudio de la Historia con Python!")
print("Prepárate para analizar datos del pasado.")
# Llamar (usar) la función
saludar_historiador()
¡Bienvenido al estudio de la Historia con Python!
Prepárate para analizar datos del pasado.
21.2.2. Anatomía de una función#
def nombre_funcion(parametros): # Definición
"""Descripción de lo que hace (docstring)""" # Documentación
# Código de la función
return resultado # Valor que devuelve (opcional)
Elemento |
Descripción |
|---|---|
|
Palabra clave para definir funciones |
|
Nombre descriptivo (snake_case) |
|
Información que recibe la función |
|
Descripción de la función |
|
Valor que devuelve la función |
Tabla 19.1: Elementos de una función en Python
21.3. Funciones con Parámetros#
Los parámetros son como “espacios en blanco” que llenamos cuando usamos la función.
21.3.1. Un parámetro#
# Función que saluda a un prócer específico
def saludar_procer(nombre):
"""Saluda a un prócer de la independencia."""
print(f"¡Honor al prócer {nombre}!")
# Usar la función con diferentes argumentos
saludar_procer("Bernardo O'Higgins")
saludar_procer("José de San Martín")
saludar_procer("Manuel Rodríguez")
¡Honor al prócer Bernardo O'Higgins!
¡Honor al prócer José de San Martín!
¡Honor al prócer Manuel Rodríguez!
21.3.2. Múltiples parámetros#
# Función para presentar información de un personaje histórico
def presentar_personaje(nombre, anio_nacimiento, cargo):
"""Presenta información básica de un personaje histórico."""
print(f"Nombre: {nombre}")
print(f"Año de nacimiento: {anio_nacimiento}")
print(f"Cargo principal: {cargo}")
print("-" * 40)
# Usar la función
presentar_personaje("Bernardo O'Higgins", 1778, "Director Supremo")
presentar_personaje("José Miguel Carrera", 1785, "Jefe del Gobierno")
Nombre: Bernardo O'Higgins
Año de nacimiento: 1778
Cargo principal: Director Supremo
----------------------------------------
Nombre: José Miguel Carrera
Año de nacimiento: 1785
Cargo principal: Jefe del Gobierno
----------------------------------------
21.4. La sentencia return#
La sentencia return permite que una función devuelva un valor que podemos usar después.
💡 Diferencia importante
print()solo muestra información en pantallareturndevuelve un valor que puede ser usado en otras operaciones
# Función que calcula años transcurridos
def calcular_anos_transcurridos(anio_evento):
"""Calcula cuántos años han pasado desde un evento."""
anio_actual = 2025
diferencia = anio_actual - anio_evento
return diferencia # Devuelve el resultado
# Usar el valor retornado
anos_independencia = calcular_anos_transcurridos(1818)
print(f"Han pasado {anos_independencia} años desde la Independencia")
anos_guerra = calcular_anos_transcurridos(1879)
print(f"Han pasado {anos_guerra} años desde la Guerra del Pacífico")
Han pasado 207 años desde la Independencia
Han pasado 146 años desde la Guerra del Pacífico
# Diferencia entre print y return
def sumar_con_print(a, b):
print(a + b) # Solo muestra, no devuelve
def sumar_con_return(a, b):
return a + b # Devuelve el valor
# Con print no podemos usar el resultado
resultado1 = sumar_con_print(5, 3) # Imprime 8
print(f"resultado1 = {resultado1}") # None (no hay return)
# Con return podemos usar el resultado
resultado2 = sumar_con_return(5, 3)
print(f"resultado2 = {resultado2}") # 8
print(f"resultado2 * 2 = {resultado2 * 2}") # Podemos operarlo
8
resultado1 = None
resultado2 = 8
resultado2 * 2 = 16
21.4.1. Retornar múltiples valores#
# Función que analiza un período histórico
def analizar_periodo(anio_inicio, anio_fin):
"""Analiza un período histórico y retorna estadísticas."""
duracion = anio_fin - anio_inicio
punto_medio = anio_inicio + (duracion // 2)
return duracion, punto_medio # Retorna dos valores
# Desempaquetar los valores retornados
duracion, medio = analizar_periodo(1810, 1830)
print(f"Período: 1810-1830")
print(f"Duración: {duracion} años")
print(f"Punto medio: {medio}")
Período: 1810-1830
Duración: 20 años
Punto medio: 1820
21.5. Parámetros con Valores por Defecto#
# Función con valor por defecto
def calcular_edad_en_anio(anio_nacimiento, anio_referencia=2025):
"""Calcula la edad que tendría alguien en un año dado."""
return anio_referencia - anio_nacimiento
# Usando el valor por defecto
edad_ohiggins_hoy = calcular_edad_en_anio(1778)
print(f"O'Higgins tendría {edad_ohiggins_hoy} años hoy")
# Especificando el año de referencia
edad_ohiggins_1818 = calcular_edad_en_anio(1778, 1818)
print(f"O'Higgins tenía {edad_ohiggins_1818} años en 1818")
O'Higgins tendría 247 años hoy
O'Higgins tenía 40 años en 1818
21.6. Funciones Prácticas para Historia#
21.6.1. Clasificador de Siglos#
def obtener_siglo(anio):
"""Determina a qué siglo pertenece un año."""
if anio <= 0:
siglo = abs(anio) // 100 + 1
return f"Siglo {siglo} a.C."
else:
siglo = (anio - 1) // 100 + 1
return f"Siglo {siglo}"
# Probar la función
print(f"1492 → {obtener_siglo(1492)}")
print(f"1810 → {obtener_siglo(1810)}")
print(f"2025 → {obtener_siglo(2025)}")
print(f"-44 → {obtener_siglo(-44)}")
1492 → Siglo 15
1810 → Siglo 19
2025 → Siglo 21
-44 → Siglo 1 a.C.
21.6.2. Clasificador de Períodos Chilenos#
def clasificar_periodo_chileno(anio):
"""Clasifica un año en su período de la historia de Chile."""
if anio < 1541:
return "Período Precolombino"
elif anio < 1810:
return "Período Colonial"
elif anio < 1818:
return "Proceso de Independencia"
elif anio < 1830:
return "Organización de la República"
elif anio < 1861:
return "República Conservadora"
elif anio < 1891:
return "República Liberal"
elif anio < 1925:
return "República Parlamentaria"
elif anio < 1973:
return "República Presidencial"
elif anio < 1990:
return "Régimen Militar"
else:
return "Retorno a la Democracia"
# Probar con varios años
anios_prueba = [1500, 1750, 1814, 1879, 1970, 1985, 2020]
for anio in anios_prueba:
print(f"{anio} → {clasificar_periodo_chileno(anio)}")
1500 → Período Precolombino
1750 → Período Colonial
1814 → Proceso de Independencia
1879 → República Liberal
1970 → República Presidencial
1985 → Régimen Militar
2020 → Retorno a la Democracia
21.6.3. Generador de Fichas Históricas#
def crear_ficha_historica(nombre, nacimiento, muerte, cargo, logro_principal):
"""Genera una ficha histórica formateada."""
anos_vida = muerte - nacimiento
ficha = f"""
{'='*50}
FICHA HISTÓRICA
{'='*50}
Nombre: {nombre}
Vida: {nacimiento} - {muerte} ({anos_vida} años)
Cargo: {cargo}
Logro principal: {logro_principal}
{'='*50}
"""
return ficha
# Crear fichas
ficha1 = crear_ficha_historica(
"Bernardo O'Higgins",
1778, 1842,
"Director Supremo de Chile",
"Consolidar la Independencia de Chile"
)
print(ficha1)
ficha2 = crear_ficha_historica(
"Arturo Prat Chacón",
1848, 1879,
"Capitán de Fragata",
"Heroísmo en el Combate Naval de Iquique"
)
print(ficha2)
==================================================
FICHA HISTÓRICA
==================================================
Nombre: Bernardo O'Higgins
Vida: 1778 - 1842 (64 años)
Cargo: Director Supremo de Chile
Logro principal: Consolidar la Independencia de Chile
==================================================
==================================================
FICHA HISTÓRICA
==================================================
Nombre: Arturo Prat Chacón
Vida: 1848 - 1879 (31 años)
Cargo: Capitán de Fragata
Logro principal: Heroísmo en el Combate Naval de Iquique
==================================================
21.7. 🏛️ Proyecto: Sistema de Consulta Histórica#
Combinemos todo lo aprendido en un proyecto completo:
# Sistema de Consulta Histórica de Chile
# Base de datos (diccionarios)
PERSONAJES = {
"ohiggins": {
"nombre": "Bernardo O'Higgins",
"nacimiento": 1778,
"muerte": 1842,
"cargo": "Director Supremo"
},
"carrera": {
"nombre": "José Miguel Carrera",
"nacimiento": 1785,
"muerte": 1821,
"cargo": "Jefe del Gobierno"
},
"prat": {
"nombre": "Arturo Prat",
"nacimiento": 1848,
"muerte": 1879,
"cargo": "Capitán de Fragata"
}
}
# Funciones del sistema
def mostrar_menu():
"""Muestra el menú principal."""
print("\n" + "="*40)
print(" SISTEMA DE CONSULTA HISTÓRICA")
print("="*40)
print("1. Buscar personaje")
print("2. Calcular años desde evento")
print("3. Clasificar año en período")
print("4. Salir")
def buscar_personaje(clave):
"""Busca y muestra información de un personaje."""
if clave.lower() in PERSONAJES:
p = PERSONAJES[clave.lower()]
edad = p["muerte"] - p["nacimiento"]
print(f"\n📜 {p['nombre']}")
print(f" Vida: {p['nacimiento']}-{p['muerte']} ({edad} años)")
print(f" Cargo: {p['cargo']}")
return True
else:
print("\n❌ Personaje no encontrado.")
print(f" Disponibles: {', '.join(PERSONAJES.keys())}")
return False
def calcular_anos_desde(anio):
"""Calcula años transcurridos desde un evento."""
return 2025 - anio
# Programa principal
print("¡Bienvenido al Sistema de Consulta Histórica!")
while True:
mostrar_menu()
opcion = input("\nElige una opción (1-4): ")
if opcion == "1":
nombre = input("Ingresa el nombre del personaje: ")
buscar_personaje(nombre)
elif opcion == "2":
try:
anio = int(input("Ingresa el año del evento: "))
anos = calcular_anos_desde(anio)
print(f"\n📅 Han pasado {anos} años desde {anio}")
except:
print("\n⚠️ Por favor ingresa un año válido.")
elif opcion == "3":
try:
anio = int(input("Ingresa un año: "))
periodo = clasificar_periodo_chileno(anio)
print(f"\n📚 El año {anio} corresponde al: {periodo}")
except:
print("\n⚠️ Por favor ingresa un año válido.")
elif opcion == "4":
print("\n¡Hasta pronto, historiador! 📖")
break
else:
print("\n❌ Opción no válida. Intenta de nuevo.")
21.8. 📝 Actividad de Cierre#
21.8.1. Ejercicio 1: Función de Área#
Crea una función calcular_area_rectangulo(base, altura) que retorne el área.
# Tu código aquí
21.8.2. Ejercicio 2: Verificador de Año Bisiesto#
Crea una función es_bisiesto(anio) que retorne True si es bisiesto, False si no.
# Tu código aquí
21.8.3. Ejercicio 3: Calculadora de Promedios#
Crea una función que reciba una lista de notas y retorne el promedio y si aprueba (promedio >= 4.0).
# Tu código aquí
21.9. 📚 Resumen del Capítulo#
Concepto |
Descripción |
|---|---|
|
Define una función |
Parámetros |
Variables que recibe la función |
Argumentos |
Valores que pasamos al llamar |
|
Devuelve un valor de la función |
Valores por defecto |
|
Docstring |
Documentación de la función |
Tabla 19.2: Resumen de conceptos del capítulo
21.9.1. Conceptos Clave#
Reutilización: Escribir código una vez, usarlo muchas veces
Organización: Código más limpio y fácil de mantener
Abstracción: Usar funciones sin conocer su implementación interna
Modularidad: Dividir problemas grandes en problemas pequeños
21.10. 📖 Referencias#
Python Software Foundation. (2024). Defining Functions. https://docs.python.org/3/tutorial/controlflow.html#defining-functions
Downey, A. (2015). Think Python: How to Think Like a Computer Scientist. O’Reilly Media.
Programming Historian. (2024). Introduction to Python. https://programminghistorian.org/