Oii, Daniel.
É muito bom ver você praticando. Essa dúvida sobre como "forçar" uma entrada válida é um passo clássico e muito importante no aprendizado de lógica de programação.
O que tá acontecendo no seu código é que o if apenas faz uma verificação única. Se o valor for inválido, ele avisa, mas o fluxo do programa segue para a próxima repetição do for, passando para o próximo dado.
Pra resolver isso, precisamos de um "laço dentro do laço". Enquanto o usuário não digitar o valor correto, o programa não deve avançar. O while é a escolha ideal aqui, pois ele repete um bloco de instruções enquanto uma condição for verdadeira.
Ajustando seu código:
for i in range(15): # O laço principal para os 15 dados
dados = float(input(f'Digite a nota para o dado {i+1}: '))
# Aqui entra o "bloqueio": enquanto a nota for inválida, ele não sai daqui
while dados < 0 or dados > 5:
print('Valor inválido! Digite um valor entre 0 e 5.')
dados = float(input(f'Digite novamente a nota para o dado {i+1}: '))
# Quando o código chega aqui, temos a garantia de que a nota é válida
print(f'Nota confirmada: {dados}')
print('Todas as 15 notas foram coletadas com sucesso!')
Por que isso funciona?
- O
for controla a quantidade total de avaliações que você quer receber (no caso, 15). - O
while atua como um "pedágio". Se o usuário digitar algo errado, a condição dados < 0 or dados > 5 será verdadeira e o programa ficará preso dentro desse bloco pedindo a nota novamente. - O programa só sai do
while e volta para o próximo ciclo do for quando o usuário digitar um número que torne a condição do while falsa (ou seja, uma nota entre 0 e 5).
Uma dica extra
Note que dentro do while eu usei o input novamente. Isso é necessário para atualizar o valor da variável dados. Se não atualizarmos o valor lá dentro, a condição nunca mudará e teremos um loop infinito.
Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!