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

Operación

Símbolo

Palabras aceptadas

Ejemplo

Suma

+

más, suma, agregar

"5 más 3"

Resta

-

menos, resta

"10 menos 4"

Multiplicación

*

por, multiplicado, veces

"6 por 7"

División

/

dividido, entre, dividido por

"20 entre 5"

Potencia

^

elevado, a la

"2 elevado 3"


✅ Resumen clave

  1. split() separa el texto en partes usando espacios

  2. Diccionarios mapean palabras a funciones matemáticas

  3. operator.add/sub/mul/truediv son funciones listas para usar

  4. int() y float() convierten texto a números

  5. 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

  1. b) Lo convierte en ["15", "+", "23"] - split() separa por espacios

  2. b) Para traducir palabras a funciones matemáticas - Como un traductor de "más" a operator.add

  3. b) operator.mul - "mul" viene de "multiplication"

  4. b) int() no puede convertir "veinte" a número - Necesita números en dígitos

  5. 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

Entradas más populares de este blog

1-7. Transforma tu audio a texto

10. Haz que tu asistente hable

8. NUEVO - Solución si tu micrófono no está captando tu audio