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:
- 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! - 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!