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

[Projeto] Faça como eu fiz: calculando a idade

Sei que fui além do necessário, incluindo recorrencia de entrada, tratamentos de erros, mas eu queria praticar isto.

def calcular_idade(ano_nascimento, ano_atual):
    idade = ano_atual - ano_nascimento
    return idade

while True:
  try:
      ano_nascimento = int(input("Digite o ano de nascimento: "))
      ano_atual = int(input("Digite o ano atual: "))

      if ano_nascimento > ano_atual:
          print("O ano de nascimento não pode ser maior que o ano atual.")
      else:
        idade = calcular_idade(ano_nascimento, ano_atual)
        print(f"A idade é {idade} anos.")    
        break
  except ValueError:
      print("Por favor, insira números inteiros para o ano de nascimento e o ano atual.")
2 respostas
solução!

Olá, Marcelo. Como vai?

Mais uma vez, parabéns pela excelente iniciativa de ir além da atividade proposta! Incluir recorrência com laço while, tratamento de exceções com try/except e validações lógicas de negócio (como impedir que o ano de nascimento seja maior que o ano atual) são hábitos ótimos que diferenciam um bom desenvolvedor no mercado de trabalho.

O seu código está muito bem estruturado e cumpre perfeitamente o papel proposto, tratando tanto erros de digitação de texto quanto erros de consistência dos dados de forma limpa.

Para agregar ainda mais valor ao seu exercício e complementar o seu treinamento de funções e boas práticas, podemos pensar em um pequeno detalhe sobre a assinatura e o comportamento da sua função calcular_idade.

No seu código atual, a validação if ano_nascimento > ano_atual: foi feita fora da função, diretamente no fluxo do programa principal. No design de software, costumamos dizer que é uma boa prática tornar as nossas funções "independentes" e "inteligentes", deixando que elas próprias validem as regras de negócio dos dados que recebem. Além disso, assim como vimos em exercícios anteriores, podemos usar a biblioteca datetime para deixar o parâmetro do ano_atual como opcional, pegando o ano real do sistema de forma automática caso o usuário não informe um.

Veja esta sugestão de como modularizar e enriquecer ainda mais a sua função:

from datetime import datetime

def calcular_idade(ano_nascimento, ano_atual=None):
    # Se o ano atual não for informado, pega o ano real do sistema
    if ano_atual is None:
        ano_atual = datetime.now().year
        
    # A própria função valida os dados e dispara uma exceção se algo estiver errado
    if ano_nascimento > ano_atual:
        raise ValueError("O ano de nascimento não pode ser maior que o ano atual.")
        
    return ano_atual - ano_nascimento

# Fluxo de entrada do usuário
while True:
  try:
      ano_nasci = int(input("Digite o ano de nascimento: "))
      
      # Chamando a função apenas com o ano de nascimento (usando o ano atual automático do sistema)
      idade = calcular_idade(ano_nasci)
      
      print(f"A idade é {idade} anos.")    
      break
      
  except ValueError as erro:
      # Se o erro veio do raise da função, exibe a mensagem personalizada da regra de negócio
      if str(erro):
          print(erro)
      else:
          print("Por favor, insira números inteiros para o ano de nascimento.")

Com essa abordagem, a sua função se torna completamente reutilizável para outros lugares do sistema (como um cadastro de clientes, por exemplo), pois ela carrega a regra de validação e a inteligência de obter a data do sistema consigo mesma.

Excelente trabalho mantendo o foco em criar códigos seguros e robustos!

Espero que possa ter lhe ajudado!

Valeu o feedback