🎯 Objetivo de la Lección
Al finalizar esta lección, serás capaz de crear una calculadora en Python que permita realizar operaciones matemáticas básicas y avanzadas, almacene el historial de operaciones en una estructura de datos, y proporcione una interfaz de usuario intuitiva mediante un menú interactivo.
📚 Repaso de Conceptos Fundamentales
Antes de comenzar a construir nuestra calculadora, hagamos un breve repaso de los conceptos que utilizaremos:
while para mantener la calculadora en ejecución hasta que el usuario decida salir, y bucles for para iterar sobre el historial.🏗️ Estructura de la Calculadora
Nuestra calculadora tendrá la siguiente arquitectura:
| Componente | Descripción | Concepto Python |
|---|---|---|
| Menú principal | Interfaz de selección de operaciones | Función + condicionales |
| Operaciones | Funciones matemáticas | Funciones con parámetros |
| Historial | Registro de cálculos | Lista de diccionarios |
| Loop principal | Ejecución continua | Bucle while |
| Validación | Control de errores | Manejo de excepciones |
🔨 Construcción Paso a Paso
- Configuración inicial: Primero, importaremos el módulo necesario y definiremos la estructura del historial.
- Definición de funciones: Crearemos funciones independientes para cada operación matemática.
- Implementación del menú: Diseñaremos un sistema de menú interactivo.
- Lógica principal: Conectaremos todos los componentes con un bucle principal.
📝 Código Completo de la Calculadora
# ============================================
# CALCULADORA INTERACTIVA EN PYTHON
# Proyecto Final del Módulo
# ============================================
import os
# --- Estructura de datos para el historial ---
historial = []
# --- Funciones de operaciones básicas ---
def suma(a, b):
"""Retorna la suma de dos números."""
return a + b
def resta(a, b):
"""Retorna la resta de dos números."""
return a - b
def multiplicacion(a, b):
"""Retorna la multiplicación de dos números."""
return a * b
def division(a, b):
"""Retorna la división de dos números."""
if b == 0:
return "Error: No se puede dividir por cero"
return a / b
def potencia(a, b):
"""Retorna 'a' elevado a la potencia 'b'."""
return a ** b
def raiz_cuadrada(a):
"""Retorna la raíz cuadrada de un número."""
if a < 0:
return "Error: No existe raíz cuadrada de números negativos"
return a ** 0.5
def modulo(a, b):
"""Retorna el módulo de la división."""
if b == 0:
return "Error: No se puede calcular módulo con divisor cero"
return a % b
# --- Diccionario de operaciones ---
operaciones = {
'1': {'nombre': 'Suma', 'funcion': suma, 'parametros': 2},
'2': {'nombre': 'Resta', 'funcion': resta, 'parametros': 2},
'3': {'nombre': 'Multiplicación', 'funcion': multiplicacion, 'parametros': 2},
'4': {'nombre': 'División', 'funcion': division, 'parametros': 2},
'5': {'nombre': 'Potencia', 'funcion': potencia, 'parametros': 2},
'6': {'nombre': 'Raíz cuadrada', 'funcion': raiz_cuadrada, 'parametros': 1},
'7': {'nombre': 'Módulo', 'funcion': modulo, 'parametros': 2}
}
# --- Función para mostrar el menú ---
def mostrar_menu():
"""Muestra el menú principal de la calculadora."""
print("\n" + "="*40)
print(" 🧮 CALCULADORA INTERACTIVA 🧮")
print("="*40)
print("\nSelecciona una operación:\n")
for clave, datos in operaciones.items():
print(f" {clave}. {datos['nombre']}")
print("\n 8. Ver historial")
print(" 9. Limpiar historial")
print(" 0. Salir")
print("-"*40)
# --- Función para obtener números del usuario ---
def obtener_numeros(cantidad):
"""Solicita números al usuario con validación."""
numeros = []
for i in range(cantidad):
while True:
try:
if cantidad == 1:
num = float(input("\nIngresa el número: "))
else:
num = float(input(f"\nIngresa el número {i+1}: "))
numeros.append(num)
break
except ValueError:
print("⚠️ Error: Por favor, ingresa un número válido.")
return numeros
# --- Función para guardar en historial ---
def guardar_historial(operacion, operandos, resultado):
"""Guarda una operación en el historial."""
historial.append({
'operacion': operacion,
'operandos': operandos,
'resultado': resultado
})
# --- Función para mostrar historial ---
def mostrar_historial():
"""Muestra todas las operaciones realizadas."""
print("\n" + "="*50)
print(" 📜 HISTORIAL DE OPERACIONES")
print("="*50)
if not historial:
print("\n No hay operaciones registradas aún.")
else:
for i, registro in enumerate(historial, 1):
operandos_str = ', '.join(str(n) for n in registro['operandos'])
print(f"\n {i}. {registro['operacion']}({operandos_str}) = {registro['resultado']}")
print("\n" + "-"*50)
# --- Función principal ---
def calculadora():
"""Función principal que ejecuta el programa."""
print("\n🎉 ¡Bienvenido a tu Calculadora en Python!")
print("Esta calculadora fue construida por ti usando los conceptos")
print("de estructuras de datos, bucles y funciones.\n")
while True:
mostrar_menu()
opcion = input("\n👉 Selecciona una opción: ")
if opcion == '0':
print("\n¡Gracias por usar la calculadora! 👋")
print(f"Realizaste {len(historial)} operaciones.")
break
elif opcion == '8':
mostrar_historial()
elif opcion == '9':
historial.clear()
print("\n✅ Historial limpiado exitosamente.")
elif opcion in operaciones:
datos_op = operaciones[opcion]
print(f"\n>>> {datos_op['nombre'].upper()}")
numeros = obtener_numeros(datos_op['parametros'])
if datos_op['parametros'] == 1:
resultado = datos_op['funcion'](numeros[0])
operandos_str = f"{numeros[0]}"
else:
resultado = datos_op['funcion'](numeros[0], numeros[1])
operandos_str = f"{numeros[0]}, {numeros[1]}"
print(f"\n✨ Resultado: {numeros[0]} {datos_op['nombre']} {operandos_str.split(', ')[-1] if ',' in operandos_str else ''} = {resultado}")
guardar_historial(datos_op['nombre'], numeros, resultado)
else:
print("\n⚠️ Opción no válida. Por favor, intenta de nuevo.")
input("\nPresiona Enter para continuar...")
os.system('cls' if os.name == 'nt' else 'clear')
# --- Ejecutar el programa ---
if __name__ == "__main__":
calculadora()🔍 Análisis del Código
Estructuras de Datos Utilizadas
En nuestro código empleamos listas para almacenar el historial de operaciones y diccionarios para mapeo de operaciones. Observa cómo el diccionario operaciones contiene información estructurada que incluye el nombre de la operación, la función asociada y el número de parámetros necesarios.
Uso de Funciones
Cada operación matemática está encapsulada en su propia función. Esto cumple con el principio de separación de responsabilidades, donde cada función hace una sola cosa. Además, hemos incluido docstrings que documentan qué hace cada función.
Implementación de Bucles
El bucle while True en la función calculadora() mantiene el programa ejecutándose hasta que el usuario selecciona la opción de salir (0). Esto es típico en aplicaciones interactivas de consola.
🧠 Quiz de Comprensión
¿Por qué utilizamos un diccionario para almacenar las operaciones en lugar de múltiples variables?
- A) Los diccionarios son más rápidos que las variables
- B) Permite almacenar múltiples datos relacionados (nombre, función, parámetros) y facilita la extensibilidad del código
- C) Es obligatorio usar diccionarios en Python
- D) Los diccionarios usan menos memoria
¿Qué tipo de dato estamos usando para almacenar el historial de operaciones?
- A) Un diccionario
- B) Una tupla
- C) Una lista de diccionarios
- D) Un conjunto (set)
📋 Ejercicios de Práctica
🎯 Puntos Clave para Recordar
"Un buen programador diseña programas que sean fáciles de modificar y扩展ar. Utilizar estructuras de datos apropiadas y funciones bien definidas es la clave para lograrlo."
- ✅ Las listas son ideales para colecciones ordenadas que pueden crecer dinámicamente
- ✅ Los diccionarios son perfectos para mapeo de datos y configuración
- ✅ Las funciones deben tener una responsabilidad única y clara
- ✅ Los bucles while son ideales para menús interactivos y programas que se repiten
- ✅ El manejo de errores es crucial para aplicaciones robustas
🚀 Próximos Pasos
¡Felicitaciones por completar este proyecto! Has demostrado entender cómo integrar estructuras de datos, bucles y funciones en una aplicación funcional. Los conceptos que has aprendido aquí son fundamentales para cualquier aplicación Python que desarrolles en el futuro.
Ver más: Consejos para mejorar tu calculadoraAquí tienes algunas sugerencias para llevar tu calculadora al siguiente nivel:
- Manejo de excepciones avanzado: Usa bloques try-except para capturar diferentes tipos de errores.
- Guardar en archivo: Implementa persistencia guardando el historial en un archivo JSON o CSV.
- Interfaz gráfica: Usa bibliotecas como tkinter para crear una interfaz visual.
- Operaciones con más números: Modifica el sistema para aceptar múltiples operandos.
📝 Resumen del Módulo
A lo largo de este módulo has aprendido:
| Concepto | Aplicación en el Proyecto |
|---|---|
| Listas | Almacenar historial de operaciones |
| Diccionarios | Mapear operaciones con sus funciones |
| Funciones | Encapsular lógica de operaciones |
| Bucles while | Mantener el programa en ejecución |
| Condicionales | Validar opciones del menú |
| Entrada/Salida | Interactuar con el usuario |
Este proyecto integra todos los conceptos del módulo en una aplicación coherente y práctica. Ahora tienes las bases necesarias para construir aplicaciones más complejas en Python. ¡Sigue aprendiendo y programando!