Olá, Aristóteles. Como vai?
Que solução fantástica! O seu código é um excelente exemplo de como o Python permite unir simplicidade e elegância técnica. Você não apenas resolveu o desafio, mas o fez utilizando um padrão de projeto altamente profissional chamado Lookup Table (Tabela de Busca) estruturado com um dicionário e funções anônimas (lambda).
No mercado de desenvolvimento, substituir uma sequência enorme de blocos if/elif/else por um dicionário de funções (como você fez na variável operacoes) é uma das melhores práticas de refatoração para manter o código limpo e escalável. Se amanhã você precisar adicionar novas operações à sua calculadora (como potência ou resto da divisão), basta inserir uma nova linha no dicionário, sem precisar mexer em nenhuma condicional do fluxo principal do programa.
Vamos destacar as excelentes sacadas do seu código:
- Validação embutida na divisão: A sua expressão
lambda x, y: x / y if y != 0 else "Erro: divisão por zero" ficou espetacular. Tratar o erro de divisão por zero diretamente dentro da função anônima usando um operador ternário evitou que o seu programa quebrasse e gerasse uma exceção do tipo ZeroDivisionError. - Uso do operador
in: Fazer a validação com if op in operacoes: é a maneira mais limpa e performática de garantir que o sistema só tente executar uma chave que realmente existe no dicionário, blindando a aplicação contra erros de chave inexistente (KeyError).
Como você está dominando as funções lambda e estruturas de dados, quero te propor um pequeno desafio de evolução para os seus próximos projetos: a tipagem estática e segurança do operador.
Embora o seu código funcione perfeitamente para números flutuantes, na vida real o usuário pode acabar digitando uma letra por engano no lugar do número (ex: num1 = "sete"), o que causaria um erro de valor (ValueError) na linha do float(input()).
Uma maneira de encapsular ainda mais o seu programa e protegê-lo contra entradas inválidas seria criar uma função auxiliar de captura, deixando o seu script completamente à prova de falhas:
def ler_numero(mensagem):
while True:
try:
return float(input(mensagem))
except ValueError:
print("Entrada inválida! Por favor, digite um número válido.")
# O exemplo de uso ganharia essa camada de proteção:
num1 = ler_numero("Digite o primeiro número: ")
num2 = ler_numero("Digite o segundo número: ")
Essa combinação do seu padrão elegante com dicionários lambda e um tratamento de exceções com try/except elevaria o seu script ao nível de produção de grandes softwares de mercado.
Parabéns pela qualidade técnica e pela constância cirúrgica nas resoluções do fórum. Continue assim!
Espero que possa ter lhe ajudado!