Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

2
respostas

Faça como eu fiz: calculando a idade

from datetime import datetime

def titulo(txt):
    print('=' * len(txt))
    print(txt)
    print('=' * len(txt))

def ano_nascimento():
    while True:
        try:    
            ano = int(input('Informe seu ano de nascimento: '))
            return ano
        except ValueError:
            print('Digite um número válido.')
    
def idade(ano):
    idade = datetime.now().year - ano
    print(f'Sua idade é {idade} anos')


def main():
    titulo('CALCULANDO A IDADE')
    ano = ano_nascimento()
    idade(ano)



if __name__ == '__main__':
    main()
2 respostas

Olá, Giovanni. Como vai?

Mais uma vez, parabéns pela excelente estrutura de código! É muito legal ver que você continua aplicando as boas práticas de modularização em funções e mantendo a ótima estrutura com a função main().

Neste script, você trouxe duas evoluções fantásticas em relação ao projeto anterior:

  1. Tratamento de Exceções (try/except): O uso do try/except ValueError dentro da função ano_nascimento() mostra que você já está pensando na experiência do usuário e na resiliência do software. Se o usuário digitar "noventa" por extenso ou alguma letra sem querer, o programa não vai quebrar (crash), ele vai apenas pedir o dado novamente. Isso é excelente!
  2. Uso da biblioteca nativa datetime: Em vez de "chubar" o ano atual de forma estática no código (como colocar fixo o ano corrente), você usou datetime.now().year. Isso significa que o seu código é atemporal e continuará calculando a idade perfeitamente em qualquer ano futuro sem precisar de manutenção manual.

Apenas analisei o seu bloco de código e notei um pequeno detalhe de identação (recuo do código) na função idade(ano). Vamos dar uma olhada e fazer um pequeno ajuste fino:


Ajuste de Indentação

No trecho que você postou, a função idade(ano) acabou ficando recuada (dentro) do escopo da função ano_nascimento(). No Python, o alinhamento das linhas define onde uma função termina e onde outra começa.

Se o código for executado exatamente como foi colado no post, a função main() não conseguirá encontrar a função idade(ano), pois ela ficou escondida como uma função interna (nested function) de ano_nascimento.

Aqui está o código corrigido com o alinhamento correto de todas as funções na margem principal:

from datetime import datetime

def titulo(txt):
    print('=' * len(txt))
    print(txt)
    print('=' * len(txt))

def ano_nascimento():
    while True:
        try:    
            ano = int(input('Informe seu ano de nascimento: '))
            return ano
        except ValueError:
            print('Digite um número válido.')

# Movida para a margem principal (fora de ano_nascimento)
def idade(ano):
    idade_calculada = datetime.now().year - ano
    print(f'Sua idade é {idade_calculada} anos')

def main():
    titulo('CALCULANDO A IDADE')
    ano = ano_nascimento()
    idade(ano)

if __name__ == '__main__':
    main()

Uma dica sobre nomes de variáveis

Note que no ajuste acima, alterei sutilmente o nome da variável de resultado dentro da função para idade_calculada.

No seu código original estava:

def idade(ano):
    idade = datetime.now().year - ano

Embora o Python aceite, usar o mesmo nome para a função (def idade) e para a variável (idade = ...) dentro dela pode gerar confusões de leitura ou pequenos avisos (warnings) em algumas IDEs. Mudar o nome da variável interna é uma boa prática para manter a semântica impecável.

O seu raciocínio lógico com laços de repetição infinitos (while True) acoplados ao retorno imediato (return) é um padrão muito limpo para validação de entradas de dados. Parabéns!

Espero que possa ter lhe ajudado!

Muito obrigado pelo ótimo feedback! Ajudou bastante