Curso de Python / Validar notas e calcular média e aprovações

Para resumir notas em Python, separe os valores inválidos, conte as aprovações e calcule a média somente das notas válidas. Este exercício reúne condições e um laço for, informa quantos registros foram descartados e trata a ausência de dados antes de fazer uma divisão.

Definir as regras de validação e aprovação

O programa recebe uma lista já preparada com números inteiros. A escala deste exercício vai de 0 a 100, incluindo os dois extremos, e uma nota a partir de 60 significa aprovação. São regras escolhidas para a prática; um sistema real precisa usar a escala e os critérios da instituição.

Entrada Tratamento
0 Nota válida, sem aprovação.
59 e 60 Ambas são válidas; somente 60 alcança a aprovação.
100 Nota válida e aprovada.
-1 ou 101 Valor inválido, excluído da média e contado separadamente.
Nenhuma nota válida Exibir uma mensagem, sem calcular a média.

Converter o texto de um arquivo CSV ou de input() em números é uma etapa anterior, que este programa não executa. A condição de intervalo também não prova que o objeto recebido é um inteiro. As comparações encadeadas e condições booleanas permitem expressar o intervalo sem eliminar, por engano, a nota zero.

Executar o programa completo

Crie uma pasta de prática e salve o código completo em scores.py, com codificação UTF-8. No terminal com o ambiente virtual do projeto selecionado, execute python scores.py. Se estiver usando macOS ou Ubuntu sem ambiente virtual e o interpretador for chamado python3, use python3 scores.py. Não é necessário instalar bibliotecas externas.

scores = [80, 60, 0, 100, -1, 101]
valid = []
invalid = 0
passed = 0
for score in scores:
    if not 0 <= score <= 100:
        invalid += 1
        continue
    valid.append(score)
    if score >= 60:
        passed += 1
print("valid:", len(valid), "invalid:", invalid)
if valid:
    print(f"average: {sum(valid) / len(valid):.1f}")
    print("passed:", passed)
else:
    print("no valid scores")

O resultado esperado é:

valid: 4 invalid: 2
average: 60.0
passed: 3

Os rótulos do exemplo estão em inglês: valid indica quatro notas válidas, invalid indica duas rejeitadas, average mostra a média e passed mostra três aprovações. As notas válidas somam 240; dividir por quatro produz 60. A formatação :.1f exibe uma casa decimal, com ponto nesse formato, sem alterar a lista ou os valores usados no cálculo.

Acompanhar os contadores e o denominador da média

Em cada repetição, score recebe uma nota. Se ela estiver fora de 0 a 100, invalid aumenta e continue passa para a próxima repetição. O valor rejeitado não chega a valid.append(score) nem à verificação de aprovação. Esse comportamento de continue em laços mantém a validação antes da classificação.

passed conta aprovações apenas entre as notas aceitas. Usar if score para decidir se uma nota entra na lista seria incorreto: zero tem valor lógico falso, mas é uma nota válida. Já if valid, depois do laço, verifica se a lista tem algum elemento. Uma lista contendo somente zero é verdadeira e permite calcular a média 0,0; uma lista vazia é falsa e leva à mensagem no valid scores.

O denominador é len(valid), pois corresponde às notas que entraram na soma. Dividir pelo tamanho de scores incluiria os registros rejeitados na contagem e produziria 40,0 para os dados originais. Calcular a média uma vez, depois do laço, também evita refazer o mesmo trabalho a cada nota. Para conferir a separação, verifique se o número de válidas mais o de inválidas é igual ao tamanho da entrada; esse total, sozinho, não comprova que a regra de aprovação está correta.

Testar os limites e reconhecer as restrições

Altere somente a lista da primeira linha, execute novamente e compare cada saída. Não mude as condições durante esses testes: assim, uma diferença vem dos dados escolhidos.

  1. Substitua a lista por []. O programa deve informar zero notas válidas e zero inválidas, seguido de no valid scores. Não deve imprimir média nem aprovações.
  2. Use [0]. Deve haver uma nota válida, média 0.0 e zero aprovações. Esse caso distingue uma lista não vazia de uma nota cujo valor lógico é falso.
  3. Use [59, 60, 61]. As três notas são válidas, a média é 60.0 e duas alcançam a aprovação. Se a condição fosse score > 60, a nota 60 seria classificada incorretamente.
  4. Use [-1, 101]. As duas notas devem ser rejeitadas, sem média. Depois, use [0, 100] e confira duas válidas, média 50.0 e uma aprovação.
  5. Restaure [80, 60, 0, 100, -1, 101] e confirme novamente a saída completa e a soma das contagens: quatro mais duas corresponde aos seis registros.

Se os dados puderem ter outros tipos, defina a política antes de ampliar o programa. Um texto como "80" ou o valor None causa TypeError na comparação; não será apenas contado como inválido. Um float dentro do intervalo, como 59.5, passa pela verificação existente. Além disso, True e False são aceitos numericamente como 1 e 0 porque bool é um subtipo de int, conforme a documentação dos tipos numéricos e testes de valor lógico.

Quando a regra exigir somente inteiros comuns, uma verificação de type(score) is int antes de qualquer comparação de intervalo pode rejeitar booleanos e outros tipos. Essa política também exclui subclasses de inteiro; decida se isso é adequado à origem dos dados. Se preferir aceitar texto numérico ou notas decimais, a conversão e o tratamento de falhas precisam ser implementados explicitamente. O exemplo apresentado valida o intervalo sob a premissa de uma lista de inteiros, sem realizar essas conversões.