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.
- Substitua a lista por
[]. O programa deve informar zero notas válidas e zero inválidas, seguido deno valid scores. Não deve imprimir média nem aprovações. - Use
[0]. Deve haver uma nota válida, média0.0e zero aprovações. Esse caso distingue uma lista não vazia de uma nota cujo valor lógico é falso. - Use
[59, 60, 61]. As três notas são válidas, a média é60.0e duas alcançam a aprovação. Se a condição fossescore > 60, a nota 60 seria classificada incorretamente. - Use
[-1, 101]. As duas notas devem ser rejeitadas, sem média. Depois, use[0, 100]e confira duas válidas, média50.0e uma aprovação. - 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.




