Dúvida em estrutura de repetição

Estou com dúvidas em um código sobre informar a vida do usuário em dias. O usuário deve informar o ano de nascimento, mês de nascimento (em número), dia de nascimento, ano atual, mês atual (em números) e dia atual. Se o usuário informar uma dia que seja negativo ou maior que 30, ou se informar um mês negativo ou maior que 12 ou um ano negativo ou ano atual menor que o ano de nascimento, o código deverá repetir infinitamente até ser informado a data correta. No final, o programa deverá ter como saída a data de vida do usuário em dias considerando que não existe ano bissexto e todos os meses possuem 30 dias.

estava pensando na seguinte lógica:

Se o mês de nascimento é menor do que o mês atual, significa que o usuário completou aniversário, então o ano será (ano atual - ano de nascimento)*360. Além disto, o mês de nascimento será o (((mês de nascimento-1)*30)+diadenascimento). O mes atual será o (((mesatual-1)*30)+diaatual). para calcular tudo, pega mesatual-mesdenascimento+ano

diadonascimento = 1
mesdonascimento = 1
anodenascimento = 1
diaatual = 1
mesatual = 1
anoatual = 1

#while True:
diadonascimento = int(input("Digite, por gentileza o dia do seu nascimento: "))
while diadonascimento <=0 or diadonascimento>30:
    diadonascimento = int(input("Digite, por gentileza o dia do seu nascimento: "))
mesdonascimento = int(input("Digite, por gentileza o mês do seu nascimento, em números: "))
while mesdonascimento <=0 or mesdonascimento>12:
    mesdonascimento = int(input("Digite, por gentileza o mês do seu nascimento, em números: "))
anodenascimento = int(input("Digite, por gentileza o ano do seu nascimento: "))
while anodenascimento <=0:
    anodenascimento = int(input("Digite, por gentileza o ano do seu nascimento: "))
diaatual = int(input("Digite, por gentileza o dia atual: "))
while diaatual <=0 or diadonascimento>30:
    diaatual = int(input("Digite, por gentileza o dia atual: "))
mesatual = int(input("Digite, por gentileza o mês atual, em números: "))
while mesatual <=0 or mesatual >12:
    mesatual = int(input("Digite, por gentileza o mês atual, em números: "))
anoatual = int(input("Digite, por gentileza o ano atual: "))
while anoatual <=0 or anoatual<anodenascimento:
    anoatual = int(input("Digite, por gentileza o ano atual: "))

if mesdonascimento<mesatual:
    ano = int((anoatual-anodenascimento)*360)
    mes1 = int(((mesdonascimento-1)*30)+diadonascimento)
    mes2 = int(((mesatual-1)-30)+diaatual)
    mes = int(mes2-mes1)

    total=ano+mes

    print(f"Sua idade atual é {total} dias")`Texto pré-formatado`

desde já, muito obrigado.

Para ler os valores, como a lógica será repetitiva (faz um loop que lê o número até que seja válido), e o que muda são apenas os limites máximo e mínimo, sugiro fazer uma função genérica, que recebe a mensagem e os valores mínimo e máximo:

def ler(mensagem, minimo, maximo):
    while True:
        valor = int(input(mensagem))
        if minimo <= valor <= maximo:
            return valor
        print(f'valor inválido, deve estar entre {minimo} e {maximo}')

Quando o valor for válido, ele é retornado: o return retorna o valor e sai da função, interrompendo o loop.

Aí basta usar a função para ler os dados:

# ler data de nascimento
dianasc = ler('Digite o dia de nascimento:', 1, 30)
mesnasc = ler('Digite o mês de nascimento:', 1, 12)
anonasc = ler('Digite o ano de nascimento:', 1, 2020)

# ler data atual
dia = ler('Digite o dia atual:', 1, 30)
mes = ler('Digite o mês atual:', 1, 12)
# o valor mínimo do ano atual é o ano de nascimento
ano = ler('Digite o ano atual:', anonasc, 2020)

def dias(dia, mes, ano):
    return (ano * 365) + (mes * 30) + dia

diff = dias(dia, mes, ano) - dias(dianasc, mesnasc, anonasc)
print(f'idade: {diff} dias')

Como é um cálculo simplificado (todos os meses tem 30 dias e não há anos bissextos), transformei a data em um único valor (a quantidade de dias desde o ano zero, ou algo assim). Aí basta subtrair os valores, que o resultado é a quantidade de dias.


Vale lembrar que para cálculos reais (levando em conta anos bissextos, etc), é melhor usar o que já tem pronto. No caso, o Python já vem com o módulo datetime:

from datetime import date
 
diff = date(ano, mes, dia) - date(anonasc, mesnasc, dianasc)
dias = int(diff.total_seconds() / (3600 * 24))
print(f'idade: {dias} dias')
1 curtida

Muito muito muito obrigado!! Você tem me ajudado muito! Você tem me ensinado ferramentas no Python que eu nem sabia que existiam! Valeu pela ajuda!!!