Olá, Luísa. Como vai?
O seu projeto ficou espetacular! É muito bacana ver a evolução de um mesmo código dentro do post: você começou com a estrutura sequencial básica e depois evoluiu para uma solução altamente profissional utilizando funções, tipagem de dados (type hints), documentação com docstrings e, o mais importante, tratamento de exceções.
Gostaria de destacar excelentes decisões técnicas que você tomou na segunda versão do código:
- O uso do
.replace(",", "."): Essa é uma sacada sensacional de Experiência do Usuário (UX). No Brasil, as pessoas usam a vírgula para separar os centavos. Sem esse tratamento, se alguém digitasse 2500,50, o Python geraria um erro imediatamente. - Validação de valores negativos: Prever que um gasto não pode ser menor que zero impede dados corrompidos no seu sistema de orçamento.
- Bloco
try/except: Capturar o ValueError blinda o seu programa contra travamentos caso o usuário digite letras ou caracteres inválidos.
Para agregar ainda mais valor aos seus estudos sobre a estrutura if/else, vale a pena observar um detalhe sobre a manutenibilidade do código.
Na sua função verificar_gastos, você utilizou a variável global limite_gastos diretamente lá dentro. Na engenharia de software, o ideal é que uma função seja totalmente independente do mundo externo. Se no futuro você quiser usar essa mesma função para verificar o orçamento de uma viagem que tem um limite diferente (por exemplo, R$ 5.000,00), você teria problemas.
Para resolver isso, a melhor prática é passar o limite como um parâmetro opcional (com um valor padrão) dentro da própria função. Veja como o seu código ganharia flexibilidade:
# A função agora recebe o gasto e, se ninguém informar o limite, ela assume 3000.0 por padrão
def verificar_gastos(gasto: float, limite: float = 3000.0) -> str:
"""Validar o gasto atual em relação ao limite estabelecido."""
if gasto > limite:
return (
"Atenção! Você ultrapassou o limite do orçamento.\n"
f"Limite de gastos: R${limite:.2f} | Gasto total: R${gasto:.2f}"
)
return (
"Parabéns! Você está dentro do orçamento.\n"
f"Limite de gastos: R${limite:.2f} | Gasto total: R${gasto:.2f}"
)
try:
entrada = input("Digite seu gasto: ").replace(",", ".")
gasto_total = float(entrada)
if gasto_total < 0:
print("ERRO: O valor das despesas não pode ser negativo.")
else:
# Chamada limpa da função (usando o limite padrão de 3000.0)
print(verificar_gastos(gasto_total))
# Exemplo de reutilização para outro limite se precisasse no futuro:
# print(verificar_gastos(gasto_total, limite=5000.0))
except ValueError:
print("ERRO: Entrada inválida! Por favor, digite apenas números.")
Essa pequena alteração isola completamente o comportamento da função, tornando o seu código modular, reutilizável e com um padrão de arquitetura digno de sistemas de grande porte.
Parabéns pelo excelente nível de dedicação, organização e clareza no desenvolvimento da atividade!
Espero que possa ter lhe ajudado!