Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Criei uma cacluladora simples. Alguma sugestão de melhoria ou correção necessária?

def menu():
    """Exibe o menu da calculadora."""
    print("-" * 12)
    print("CALCULADORA")
    print("-" * 12)
    print("1 - ➕")
    print("2 - ➖")
    print("3 - ✖️")
    print("4 - ➗")
    print("5 - Sair")

def ler_numero(mensagem):
    """Lê um número do usuário com tratamento de erro."""
    while True:
        try:
            return float(input(mensagem))
        except ValueError:
            print("Digite apenas números. Tente novamente.")

def somar(a, b):
    """Retorna a soma de dois números."""
    return a + b

def subtrair(a, b):
    """Retorna a subtração de dois números."""
    return a - b

def multiplicar(a, b):
    """Retorna a multiplicação de dois números."""
    return a * b


def dividir(a, b):
    """Retorna a divisão de dois números, tratando divisão por zero."""
    if b == 0:
        print("Erro: divisão por zero não é permitida.")
        return None
    return a / b


# Exemplo de uso da calculadora
if __name__ == "__main__":
    while True:
        try:
            menu()
            opcao = int(input("\nEscolha uma opção: "))

            match opcao:
                case 1:
                    num1 = ler_numero("Digite o primeiro número: ")
                    num2 = ler_numero("Digite o segundo número: ")
                    print(f"{num1} + {num2} = {somar(num1, num2)}")

                case 2:
                    num1 = ler_numero("Digite o primeiro número: ")
                    num2 = ler_numero("Digite o segundo número: ")
                    print(f"{num1} - {num2} = {subtrair(num1, num2)}")

                case 3:
                    num1 = ler_numero("Digite o primeiro número: ")
                    num2 = ler_numero("Digite o segundo número: ")
                    print(f"{num1} x {num2} = {multiplicar(num1, num2)}")

                case 4:
                    num1 = ler_numero("Digite o primeiro número: ")
                    num2 = ler_numero("Digite o segundo número: ")
                    resultado = dividir(num1, num2)
                    if resultado is not None:
                        print(f"{num1} / {num2} = {resultado}")

                case 5:
                    print("Saindo...")
                    break

                case _:
                    print("Opção inválida. Digite de 1 a 5.")

        except ValueError:
            print("Digite apenas números. Tente novamente.")
2 respostas
solução!

Oii João Filipe,

Seu código tá muito bem estruturado e demonstra que você já domina conceitos importantes da linguagem, como o tratamento de exceções e a modularização através de funções.

Gostaria de destacar três pontos excelentes na sua implementação:

  • Documentação (Docstrings): O uso de comentários explicativos logo abaixo da definição das funções ("""Exibe o menu...""") é uma prática profissional essencial para manter o código legível.
  • Tratamento de Erros: A função ler_numero com o bloco try/except garante que o programa não quebre se o usuário digitar uma letra sem querer. Isso melhora muito a experiência de uso.
  • Modernidade: O uso do match/case mostra que você está utilizando as versões mais recentes do Python (3.10+), o que é ótimo.

Sugestão de melhoria (Princípio DRY - Don't Repeat Yourself):

Notei que as linhas para pedir o primeiro número e o segundo número se repetem dentro de quase todas as opções do case. Uma boa prática é evitar repetições. Você pode solicitar os números uma única vez antes de entrar no match, mas cuidando para não pedir isso caso o usuário escolha a opção de sair (5) ou uma opção inválida.

Veja como ficaria essa refatoração lógica:

# Trecho do loop principal
if __name__ == "__main__":
    while True:
        try:
            menu()
            opcao = int(input("\nEscolha uma opção: "))

            # Primeiro verificamos se é para sair
            if opcao == 5:
                print("Saindo...")
                break
            
            # Verificamos se é uma opção de cálculo válida antes de pedir os números
            elif opcao in [1, 2, 3, 4]:
                num1 = ler_numero("Digite o primeiro número: ")
                num2 = ler_numero("Digite o segundo número: ")

                match opcao:
                    case 1:
                        print(f"{num1} + {num2} = {somar(num1, num2)}")
                    case 2:
                        print(f"{num1} - {num2} = {subtrair(num1, num2)}")
                    case 3:
                        print(f"{num1} x {num2} = {multiplicar(num1, num2)}")
                    case 4:
                        resultado = dividir(num1, num2)
                        if resultado is not None:
                            print(f"{num1} / {num2} = {resultado}")
            
            else:
                print("Opção inválida. Digite de 1 a 5.")

        except ValueError:
            print("Digite apenas números inteiros para a opção.")

Dessa forma, seu código fica mais limpo e fácil de manter. Se amanhã você quiser mudar a frase "Digite o primeiro número", mudará em apenas um lugar, e não em quatro.

Parabéns pelo projeto.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Muito obrigado!!!