23. Calculadora
23. Calculadora con Python: Tutorial para Principiantes
🧮 Introducción: Tu asistente matemático personal
¡Es hora de que tu asistente virtual se convierta en tu calculadora personal! Imagina poder decir "calcula 15 + 23" y obtener la respuesta inmediatamente. Vamos a enseñarle a tu asistente a hacer matemáticas básicas usando solo tu voz.
Analoǵía: Tu asistente será como un estudiante que:
Escucha el problema matemático
Procesa los números y operaciones
Calcula el resultado
Responde con la solución
🔢 ¿Cómo funciona? Esquema visual
text
🎤 TÚ: "calcula 15 + 23"
↓
🤖 ASISTENTE: Detecta palabra "calcula"
↓
✂️ SEPARA: ["15", "+", "23"]
↓
🔍 IDENTIFICA: número1=15, operador="+", número2=23
↓
⚙️ CONVIERTE: "+" → operador.add (función de suma)
↓
🧮 CALCULA: 15 + 23 = 38
↓
🔊 RESPONDE: "El resultado es 38"
🛠️ Lo que necesitaremos
Librería: operator
¡Ya viene con Python! No necesitas instalarla
Contiene funciones matemáticas como add, sub, mul, truediv
Es como una caja de herramientas matemáticas
python
import operator # ← ¡Gratis y lista para usar!
✍️ Código paso a paso explicado
Paso 1: Detectar cuando queremos calcular
python
# En tu función principal:
if 'calcula' in comando or 'calcular' in comando:
calcular()
Ejemplos que activarán la función:
"Calcula algo"
"Quiero calcular"
"Haz esta operación"
"Resuelve este problema"
Paso 2: Crear la función principal
python
def calcular():
"""
Pide una operación matemática y la resuelve
"""
# 1. Preguntar qué calcular
hablar("¿Qué quieres calcular?")
# 2. Escuchar la operación
operacion = escuchar()
# 3. Procesar y calcular
resultado = procesar_operacion(operacion)
# 4. Decir el resultado
if resultado is not None:
hablar(f"El resultado es {resultado}")
Paso 3: Entender split() - La magia de separar texto
python
# Ejemplo de cómo funciona split():
texto = "15 + 23"
partes = texto.split() # Separa por espacios
print(partes) # Resultado: ["15", "+", "23"]
# Ahora podemos acceder a cada parte:
primer_numero = partes[0] # "15"
operador = partes[1] # "+"
segundo_numero = partes[2] # "23"
Analoǵía: split() es como cortar un sándwich en partes:
Texto completo: "pan jamón queso pan"
Después de split(): ["pan", "jamón", "queso", "pan"]
Cada parte es un "ingrediente" separado
Paso 4: Traducir palabras a operadores matemáticos
python
def obtener_operador(simbolo):
"""
Convierte un símbolo de texto en una función matemática
"""
# Diccionario de traducción
operadores = {
'+': operator.add, # Suma
'más': operator.add, # También acepta "más"
'-': operator.sub, # Resta
'menos': operator.sub, # También acepta "menos"
'*': operator.mul, # Multiplicación
'por': operator.mul, # También acepta "por"
'x': operator.mul, # También acepta "x"
'/': operator.truediv, # División
'dividido': operator.truediv, # También acepta "dividido"
'entre': operator.truediv # También acepta "entre"
}
# Buscar el operador en el diccionario
if simbolo in operadores:
return operadores[simbolo]
else:
return None
¿Cómo funciona un diccionario?
python
# Es como un menú de restaurante:
menu = {
"hamburguesa": 10, # Clave: "hamburguesa", Valor: 10
"pizza": 15, # Clave: "pizza", Valor: 15
"ensalada": 8 # Clave: "ensalada", Valor: 8
}
# Para pedir una pizza:
precio = menu["pizza"] # Devuelve 15
Paso 5: Convertir texto a números
python
# Los números vienen como texto "15", necesitamos convertirlos
numero_texto = "15"
numero_real = int(numero_texto) # Ahora es el número 15
# También funciona con decimales:
decimal_texto = "3.14"
decimal_real = float(decimal_texto) # Ahora es 3.14
🎯 Código completo mejorado
python
# ASISTENTE VIRTUAL - CALCULADORA
import operator
import pyttsx3
# Configuración de voz
engine = pyttsx3.init()
def hablar(texto):
engine.say(texto)
engine.runAndWait()
def procesar_operacion(operacion_texto):
"""
Procesa una operación matemática en texto y devuelve el resultado
Args:
operacion_texto (str): Ejemplo: "15 + 23"
Returns:
float or None: Resultado de la operación o None si hay error
"""
try:
# Separar la operación en partes
partes = operacion_texto.split()
# Verificar que tengamos suficientes partes
if len(partes) < 3:
hablar("Por favor di algo como: 15 más 23")
return None
# Extraer números y operador
# Manejar casos como "15 más 23" o "15 + 23"
try:
num1 = float(partes[0]) # Primer número
num2 = float(partes[2]) # Tercer número
operador_texto = partes[1].lower() # Operador (segundo elemento)
except (ValueError, IndexError):
# Intentar otro formato: "veinte más treinta"
return procesar_palabras(operacion_texto)
# Obtener la función matemática correspondiente
funcion_operador = obtener_operador(operador_texto)
if funcion_operador is None:
hablar(f"No reconozco el operador '{operador_texto}'")
return None
# Realizar la operación
resultado = funcion_operador(num1, num2)
# Formatear resultado (quitar decimales innecesarios)
if resultado.is_integer():
return int(resultado)
else:
return round(resultado, 2) # Redondear a 2 decimales
except Exception as e:
print(f"Error en cálculo: {e}")
return None
def obtener_operador(simbolo):
"""
Diccionario que mapea texto a funciones matemáticas
"""
operadores = {
# Suma
'+': operator.add,
'más': operator.add,
'suma': operator.add,
'más': operator.add,
# Resta
'-': operator.sub,
'menos': operator.sub,
'resta': operator.sub,
# Multiplicación
'*': operator.mul,
'x': operator.mul,
'por': operator.mul,
'multiplicado': operator.mul,
'veces': operator.mul,
# División
'/': operator.truediv,
'÷': operator.truediv,
'dividido': operator.truediv,
'entre': operator.truediv,
'dividido por': operator.truediv,
# Potencia (extra)
'^': operator.pow,
'elevado': operator.pow,
'a la': operator.pow,
}
# Buscar el operador (insensible a mayúsculas/minúsculas)
return operadores.get(simbolo.lower())
def calculadora_avanzada():
"""
Versión mejorada con múltiples operaciones y manejo de errores
"""
hablar("Soy tu calculadora personal. Di 'ayuda' para ver operaciones disponibles.")
while True:
hablar("¿Qué operación quieres realizar?")
operacion = escuchar().lower()
if not operacion:
continue
# Comandos especiales
if 'salir' in operacion or 'terminar' in operacion:
hablar("Cerrando calculadora")
break
if 'ayuda' in operacion:
hablar("""Puedo hacer: suma, resta, multiplicación, división.
Ejemplos: '15 más 23', '50 menos 17', '6 por 7', '100 dividido 4'""")
continue
if 'calcula' in operacion:
# Extraer solo la parte matemática
operacion = operacion.replace('calcula', '').replace('calcular', '').strip()
# Procesar la operación
resultado = procesar_operacion(operacion)
if resultado is not None:
# Hacer que suene más natural
if isinstance(resultado, float) and resultado.is_integer():
resultado = int(resultado)
respuestas = [
f"El resultado es {resultado}",
f"Da {resultado}",
f"Es igual a {resultado}",
f"Obtenemos {resultado}"
]
import random
hablar(random.choice(respuestas))
# También mostrar en pantalla
print(f"🧮 {operacion} = {resultado}")
def calculadora_rapida(comando):
"""
Calcula directamente sin preguntar
Ejemplo: "calcula 15 más 23"
"""
# Extraer la parte matemática del comando
palabras_clave = ['calcula', 'calcular', 'cuánto es', 'qué es']
for palabra in palabras_clave:
if palabra in comando:
# Extraer la operación matemática
operacion = comando.split(palabra)[1].strip()
resultado = procesar_operacion(operacion)
if resultado is not None:
hablar(f"{operacion} es igual a {resultado}")
return
# Diagrama visual del proceso:
"""
🎤 TÚ DICES: "calcula 15 más 23"
↓
🤖 ASISTENTE: Detecta "calcula"
↓
🔢 PROCESA: separa → ["15", "más", "23"]
↓
📚 TRADUCE: "más" → operator.add (función suma)
↓
🔢 CONVIERTE: "15" → 15 (número), "23" → 23
↓
🧮 EJECUTA: operator.add(15, 23) = 38
↓
💬 FORMATEA: 38 → "38"
↓
🔊 RESPONDE: "15 más 23 es igual a 38"
"""
✨ Operaciones adicionales que puedes agregar
1. Operaciones con múltiples números:
python
def calcular_suma_multiple(numeros):
"""Suma todos los números de una lista"""
total = 0
for num in numeros:
total += num
return total
# Ejemplo: "suma 1 2 3 4 5" → 15
2. Operaciones complejas:
python
def calcular_promedio(numeros):
"""Calcula el promedio de una lista"""
if len(numeros) == 0:
return 0
return sum(numeros) / len(numeros)
3. Memoria de calculadora:
python
memoria = 0
def agregar_a_memoria(valor):
global memoria
memoria += valor
hablar(f"Memoria: {memoria}")
def usar_memoria():
hablar(f"El valor en memoria es {memoria}")
return memoria
🚨 Manejo de errores importantes
Error 1: División por cero
python
try:
resultado = num1 / num2
except ZeroDivisionError:
hablar("No se puede dividir por cero")
return None
Error 2: Números no válidos
python
try:
num1 = float(partes[0])
except ValueError:
hablar(f"'{partes[0]}' no es un número válido")
return None
Error 3: Operador desconocido
python
if operador_func is None:
hablar(f"No reconozco '{operador_texto}'. Prueba con: más, menos, por, dividido")
return None
📊 Tabla de operadores soportados
✅ Resumen clave
split() separa el texto en partes usando espacios
Diccionarios mapean palabras a funciones matemáticas
operator.add/sub/mul/truediv son funciones listas para usar
int() y float() convierten texto a números
Siempre usar try-except para manejar errores
📝 Cuestionario de repaso
Pregunta 1
¿Qué hace split() con el texto "15 + 23"?
a) Lo suma automáticamente
b) Lo convierte en ["15", "+", "23"]
c) Lo transforma en número
d) Lo guarda en un archivo
Pregunta 2
¿Para qué usamos el diccionario de operadores?
a) Para guardar los resultados
b) Para traducir palabras a funciones matemáticas
c) Para imprimir en pantalla
d) Para escuchar mejor
Pregunta 3
¿Qué función usarías para la multiplicación?
a) operator.sum
b) operator.mul
c) operator.mult
d) operator.times
Pregunta 4
Si el usuario dice "veinte más treinta", ¿qué problema tendremos?
a) Nada, funcionará perfecto
b) int() no puede convertir "veinte" a número
c) No reconocerá "más"
d) Se cerrará el programa
Pregunta 5
¿Por qué es importante usar try-except en la calculadora?
a) Para que sea más rápida
b) Para manejar errores como división por cero
c) Porque es obligatorio en Python
d) Para instalar librerías automáticamente
Respuestas del cuestionario
b) Lo convierte en ["15", "+", "23"] - split() separa por espacios
b) Para traducir palabras a funciones matemáticas - Como un traductor de "más" a operator.add
b) operator.mul - "mul" viene de "multiplication"
b) int() no puede convertir "veinte" a número - Necesita números en dígitos
b) Para manejar errores como división por cero - Los usuarios pueden cometer errores
🎁 Reto final: Mejora tu calculadora
Desafío 1: Agrega números escritos
python
def texto_a_numero(texto):
"""Convierte "veinte" a 20"""
numeros_texto = {
"cero": 0, "uno": 1, "dos": 2, "tres": 3, "cuatro": 4,
"cinco": 5, "seis": 6, "siete": 7, "ocho": 8, "nueve": 9,
"diez": 10, "once": 11, "doce": 12, "trece": 13, "catorce": 14,
"quince": 15, "dieciséis": 16, "veinte": 20, "treinta": 30
}
return numeros_texto.get(texto.lower())
Desafío 2: Calculadora científica
python
import math
def calculadora_cientifica():
"""Agrega funciones científicas"""
hablar("Modo científico activado")
# Agrega: seno, coseno, tangente, logaritmos, raíces
Desafío 3: Historial de cálculos
python
historial = []
def guardar_en_historial(operacion, resultado):
historial.append(f"{operacion} = {resultado}")
def mostrar_historial():
hablar(f"Tienes {len(historial)} cálculos en historial")
for item in historial[-5:]: # Últimos 5
print(item)
🎉 ¡Felicidades!
Ahora tu asistente puede:
✅ Sumar, restar, multiplicar y dividir
✅ Entender operaciones en texto natural
✅ Manejar errores con elegancia
✅ Dar respuestas en voz alta
✅ Trabajar con números decimales
Próximo paso: Agregar calculadora científica (potencias, raíces, trigonometría), historial de cálculos, o modo de conversión de unidades.
https://www.youtube.com/watch?v=Pj9KbAKpQyk
https://www.youtube.com/watch?v=-0tIy8wWtzE
https://www.youtube.com/watch?v=YqSSId7xfwU
https://www.youtube.com/watch?v=MjK-j7YJ5YI
https://www.youtube.com/watch?v=l2G8-iQYfoA
https://www.youtube.com/watch?v=t-YO0XeHczU
Comentarios
Publicar un comentario