Creación de una calculadora simple
Introducción
Ahora que hemos aprendido los conceptos fundamentales de Python, es momento de poner en práctica estos conocimientos en un proyecto real. La creación de una calculadora simple es un excelente primer proyecto porque integra varios conceptos importantes como funciones, entrada de usuario, operadores aritméticos y estructuras de control. En este artículo, desarrollaremos paso a paso una calculadora en la consola que podrá realizar operaciones básicas como suma, resta, multiplicación y división, además de algunas operaciones más avanzadas.
Planificación del proyecto
Antes de empezar a escribir código, es importante definir qué queremos conseguir. Nuestra calculadora deberá:
- Mostrar un menú con las operaciones disponibles
- Permitir al usuario elegir una operación
- Solicitar los números con los que operar
- Realizar el cálculo correspondiente
- Mostrar el resultado
- Preguntar si el usuario desea realizar otra operación
Creación de funciones para las operaciones básicas
Empezaremos definiendo funciones para cada operación matemática:
def sumar(a, b):
"""Suma dos números y devuelve el resultado"""
return a + b
def restar(a, b):
"""Resta b de a y devuelve el resultado"""
return a - b
def multiplicar(a, b):
"""Multiplica dos números y devuelve el resultado"""
return a * b
def dividir(a, b):
"""Divide a entre b y devuelve el resultado"""
if b == 0:
return "Error: No es posible dividir entre cero"
return a / b
Observa cómo hemos añadido una validación en la función dividir
para evitar el error de división por cero.
Funciones para operaciones avanzadas
Añadamos algunas operaciones más avanzadas:
def potencia(a, b):
"""Calcula a elevado a b y devuelve el resultado"""
return a ** b
def raiz_cuadrada(a):
"""Calcula la raíz cuadrada de a"""
if a < 0:
return "Error: No se puede calcular la raíz cuadrada de un número negativo"
return a ** 0.5 # Equivalente a math.sqrt(a)
def modulo(a, b):
"""Calcula el resto de la división de a entre b"""
if b == 0:
return "Error: No es posible calcular el módulo cuando el divisor es cero"
return a % b
Creación del menú de la calculadora
Ahora crearemos una función para mostrar el menú de operaciones disponibles:
def mostrar_menu():
"""Muestra el menú de operaciones disponibles"""
print("\n==== CALCULADORA EN PYTHON ====")
print("1. Suma")
print("2. Resta")
print("3. Multiplicación")
print("4. División")
print("5. Potencia")
print("6. Raíz cuadrada")
print("7. Módulo (resto de división)")
print("8. Salir")
print("==============================")
Función para obtener números válidos
Es importante asegurarnos de que el usuario introduzca números válidos:
def obtener_numero(mensaje):
"""Solicita un número al usuario y lo devuelve"""
while True:
try:
return float(input(mensaje))
except ValueError:
print("Error: Introduce un número válido")
Esta función utiliza un bloque try-except
para manejar posibles errores si el usuario introduce algo que no es un número.
Integrando todo en el programa principal
Ahora que tenemos todas las piezas, vamos a crear el programa principal que integrará todas las funciones:
def calculadora():
"""Función principal de la calculadora"""
while True:
# Mostrar el menú
mostrar_menu()
# Obtener la opción del usuario
try:
opcion = int(input("Selecciona una operación (1-8): "))
except ValueError:
print("Error: Debes introducir un número entero")
continue
# Salir del programa
if opcion == 8:
print("¡Gracias por usar la calculadora! Hasta pronto.")
break
# Verificar que la opción es válida
if opcion < 1 or opcion > 8:
print("Error: Opción no válida. Introduce un número del 1 al 8.")
continue
# Para la raíz cuadrada solo necesitamos un número
if opcion == 6:
num = obtener_numero("Introduce el número para calcular su raíz cuadrada: ")
resultado = raiz_cuadrada(num)
print(f"La raíz cuadrada de {num} es: {resultado}")
continue
# Para el resto de operaciones necesitamos dos números
num1 = obtener_numero("Introduce el primer número: ")
num2 = obtener_numero("Introduce el segundo número: ")
# Realizar la operación según la opción elegida
if opcion == 1:
resultado = sumar(num1, num2)
print(f"{num1} + {num2} = {resultado}")
elif opcion == 2:
resultado = restar(num1, num2)
print(f"{num1} - {num2} = {resultado}")
elif opcion == 3:
resultado = multiplicar(num1, num2)
print(f"{num1} × {num2} = {resultado}")
elif opcion == 4:
resultado = dividir(num1, num2)
print(f"{num1} ÷ {num2} = {resultado}")
elif opcion == 5:
resultado = potencia(num1, num2)
print(f"{num1} ^ {num2} = {resultado}")
elif opcion == 7:
resultado = modulo(num1, num2)
print(f"{num1} % {num2} = {resultado}")
# Ejecutar la calculadora
if __name__ == "__main__":
calculadora()
Mejoras adicionales
Podemos mejorar nuestra calculadora añadiendo algunas características adicionales:
Historial de operaciones
Añadamos un historial que guarde las últimas operaciones:
def calculadora_con_historial():
"""Calculadora con historial de operaciones"""
historial = []
while True:
mostrar_menu()
# Añadir opción para ver el historial
print("9. Ver historial de operaciones")
try:
opcion = int(input("Selecciona una operación (1-9): "))
except ValueError:
print("Error: Debes introducir un número entero")
continue
if opcion == 8:
print("¡Gracias por usar la calculadora! Hasta pronto.")
break
if opcion == 9:
print("\n==== HISTORIAL DE OPERACIONES ====")
if not historial:
print("El historial está vacío")
else:
for i, operacion in enumerate(historial, 1):
print(f"{i}. {operacion}")
print("=================================")
continue
# Resto del código como antes...
# Guardar la operación en el historial
historial.append(f"{num1} {operador} {num2} = {resultado}")
# Si el historial supera 10 elementos, eliminar el más antiguo
if len(historial) > 10:
historial.pop(0)
Interfaz mejorada con colores
Para hacer la calculadora más atractiva, podemos usar la biblioteca colorama
para añadir colores:
# Primero instalar la biblioteca:
# pip install colorama
from colorama import init, Fore, Style
# Inicializar colorama
init()
def mostrar_menu_color():
"""Muestra el menú con colores"""
print(f"\n{Fore.CYAN}==== CALCULADORA EN PYTHON ===={Style.RESET_ALL}")
print(f"{Fore.GREEN}1. Suma{Style.RESET_ALL}")
print(f"{Fore.GREEN}2. Resta{Style.RESET_ALL}")
# ...
Versión completa de la calculadora
Aquí tienes el código completo de nuestra calculadora con todas las mejoras:
from colorama import init, Fore, Style
# Inicializar colorama
init()
# Funciones para operaciones
def sumar(a, b):
return a + b
def restar(a, b):
return a - b
def multiplicar(a, b):
return a * b
def dividir(a, b):
if b == 0:
return f"{Fore.RED}Error: No es posible dividir entre cero{Style.RESET_ALL}"
return a / b
def potencia(a, b):
return a ** b
def raiz_cuadrada(a):
if a < 0:
return f"{Fore.RED}Error: No se puede calcular la raíz cuadrada de un número negativo{Style.RESET_ALL}"
return a ** 0.5
def modulo(a, b):
if b == 0:
return f"{Fore.RED}Error: No es posible calcular el módulo cuando el divisor es cero{Style.RESET_ALL}"
return a % b
# Menú con colores
def mostrar_menu():
print(f"\n{Fore.CYAN}==== CALCULADORA EN PYTHON ===={Style.RESET_ALL}")
print(f"{Fore.GREEN}1. Suma{Style.RESET_ALL}")
print(f"{Fore.GREEN}2. Resta{Style.RESET_ALL}")
print(f"{Fore.GREEN}3. Multiplicación{Style.RESET_ALL}")
print(f"{Fore.GREEN}4. División{Style.RESET_ALL}")
print(f"{Fore.GREEN}5. Potencia{Style.RESET_ALL}")
print(f"{Fore.GREEN}6. Raíz cuadrada{Style.RESET_ALL}")
print(f"{Fore.GREEN}7. Módulo (resto de división){Style.RESET_ALL}")
print(f"{Fore.GREEN}8. Salir{Style.RESET_ALL}")
print(f"{Fore.GREEN}9. Ver historial de operaciones{Style.RESET_ALL}")
print(f"{Fore.CYAN}=============================={Style.RESET_ALL}")
# Obtener número con manejo de errores
def obtener_numero(mensaje):
while True:
try:
return float(input(f"{Fore.YELLOW}{mensaje}{Style.RESET_ALL}"))
except ValueError:
print(f"{Fore.RED}Error: Introduce un número válido{Style.RESET_ALL}")
# Función principal
def calculadora():
historial = []
print(f"{Fore.MAGENTA}¡Bienvenido a la Calculadora en Python!{Style.RESET_ALL}")
while True:
mostrar_menu()
try:
opcion = int(input(f"{Fore.YELLOW}Selecciona una operación (1-9): {Style.RESET_ALL}"))
except ValueError:
print(f"{Fore.RED}Error: Debes introducir un número entero{Style.RESET_ALL}")
continue
# Salir del programa
if opcion == 8:
print(f"{Fore.MAGENTA}¡Gracias por usar la calculadora! Hasta pronto.{Style.RESET_ALL}")
break
# Ver historial
if opcion == 9:
print(f"\n{Fore.CYAN}==== HISTORIAL DE OPERACIONES ===={Style.RESET_ALL}")
if not historial:
print(f"{Fore.YELLOW}El historial está vacío{Style.RESET_ALL}")
else:
for i, operacion in enumerate(historial, 1):
print(f"{Fore.WHITE}{i}. {operacion}{Style.RESET_ALL}")
print(f"{Fore.CYAN}================================={Style.RESET_ALL}")
continue
# Verificar que la opción es válida
if opcion < 1 or opcion > 9:
print(f"{Fore.RED}Error: Opción no válida. Introduce un número del 1 al 9.{Style.RESET_ALL}")
continue
# Para la raíz cuadrada solo necesitamos un número
if opcion == 6:
num = obtener_numero("Introduce el número para calcular su raíz cuadrada: ")
resultado = raiz_cuadrada(num)
if isinstance(resultado, str): # Si es un mensaje de error
print(resultado)
else:
print(f"{Fore.CYAN}La raíz cuadrada de {num} es: {resultado}{Style.RESET_ALL}")
historial.append(f"√{num} = {resultado}")
continue
# Para el resto de operaciones necesitamos dos números
num1 = obtener_numero("Introduce el primer número: ")
num2 = obtener_numero("Introduce el segundo número: ")
# Realizar la operación según la opción elegida
if opcion == 1:
resultado = sumar(num1, num2)
operador = "+"
elif opcion == 2:
resultado = restar(num1, num2)
operador = "-"
elif opcion == 3:
resultado = multiplicar(num1, num2)
operador = "×"
elif opcion == 4:
resultado = dividir(num1, num2)
operador = "÷"
elif opcion == 5:
resultado = potencia(num1, num2)
operador = "^"
elif opcion == 7:
resultado = modulo(num1, num2)
operador = "%"
# Mostrar resultado y guardar en historial si no es un mensaje de error
if isinstance(resultado, str): # Si es un mensaje de error
print(resultado)
else:
print(f"{Fore.CYAN}{num1} {operador} {num2} = {resultado}{Style.RESET_ALL}")
historial.append(f"{num1} {operador} {num2} = {resultado}")
# Si el historial supera 10 elementos, eliminar el más antiguo
if len(historial) > 10:
historial.pop(0)
# Ejecutar la calculadora
if __name__ == "__main__":
calculadora()
Resumen
En este artículo hemos creado una calculadora simple pero funcional utilizando Python. Hemos aplicado conceptos como funciones, estructuras de control, manejo de excepciones y módulos externos. La calculadora permite realizar operaciones básicas como suma, resta, multiplicación y división, así como operaciones más avanzadas como potencias, raíces cuadradas y módulo.
Además, hemos implementado características adicionales como un historial de operaciones y una interfaz mejorada con colores. Este proyecto demuestra cómo se pueden integrar diferentes conceptos de Python para crear una aplicación práctica y útil.
En los próximos artículos, continuaremos desarrollando proyectos cada vez más complejos que nos permitirán aplicar y profundizar en nuestros conocimientos de Python.