Corso Python / Esercizio: validare punteggi e calcolare media e promossi
Un riepilogo dei punteggi unisce validazione, classificazione e calcolo delle statistiche. Escludi i punteggi non validi dalla media e segnala quanti ne hai esclusi, così il risultato non nasconde la perdita di dati.
Definire le regole prima del calcolo
L’esercizio parte da una lista già preparata di numeri interi. I punteggi validi vanno da 0 a 100 inclusi e un punteggio di almeno 60 è sufficiente. Convertire testo proveniente da CSV o input utente è una fase distinta: il controllo dell’intervallo non sostituisce la lettura e la conversione del dato.
| Caso | Trattamento |
|---|---|
| 60 | Valido e sufficiente. |
| 0 | Valido, ma non sufficiente. |
| -1 o 101 | Incrementa il conteggio degli esclusi. |
| Nessun punteggio valido | Non calcolare la media. |
Le regole dei confronti e dei valori logici permettono di esprimere l’intervallo senza perdere zero. Per il flusso di if, for e continue puoi consultare anche la guida ufficiale al controllo del flusso.
Eseguire il riepilogo completo
Salva il programma seguente in UTF-8 come scores.py, in una cartella di esercitazione. Esegui python scores.py con l’interprete del progetto selezionato. Su macOS o Ubuntu fuori dall’ambiente virtuale usa python3 se è il comando dell’interprete scelto. Il codice usa soltanto funzioni predefinite.
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")
Il risultato atteso è:
valid: 4 invalid: 2
average: 60.0
passed: 3
I punteggi validi sono 80, 60, 0 e 100: quattro valori con somma 240 e media 60.0. Quelli sufficienti sono 80, 60 e 100, quindi passed vale 3. I valori -1 e 101 vengono esclusi, e i conteggi 4 e 2 ricompongono i sei elementi iniziali.
Seguire contatori, filtro e denominatore
invalid conta i dati fuori intervallo; passed conta i punteggi sufficienti solo tra quelli validi. Il continue viene eseguito prima di append, impedendo a un dato scartato di entrare in valid e di influenzare il denominatore della media.
Non sostituire il controllo dell’intervallo con if score: zero è falso in un contesto logico, ma qui è un punteggio valido. Il controllo if valid dopo il ciclo ha invece un altro scopo: verifica se la lista contiene almeno un valore prima di dividere per la sua lunghezza.
La media viene calcolata una volta, dopo avere raccolto i dati validi. Il codice divide sum(valid) per len(valid) e mostra una cifra decimale tramite :.1f. Quel formato modifica la visualizzazione del risultato, non costituisce una diversa regola di ammissione dei punteggi.
Se valid è vuota, il ramo else stampa no valid scores e non esegue la divisione. In questa versione, in quel ramo non viene neppure stampata la riga passed, anche se il contatore inizializzato è zero. Mantieni coerenti descrizione e output quando cambi il formato del riepilogo.
Provare i confini e dichiarare i limiti dell’input
- Sostituisci scores con
[]: il conteggio deve indicare zero validi e zero esclusi, seguito da no valid scores. - Usa
[59, 60, 61]: tutti e tre sono validi, la media è 60.0 e due sono sufficienti. - Usa
[-1, 101]: entrambi sono esclusi e non deve apparire una media. - Controlla separatamente
[0]e[100]per verificare i limiti inclusi. - Ripristina la lista originale e verifica che il numero di validi più quello degli esclusi coincida con il numero degli input.
Questa versione verifica l’intervallo sotto l’ipotesi iniziale di interi, non impone il tipo. Un float compreso nell’intervallo può passare; anche un booleano può essere trattato numericamente, perché bool è una sottoclasse di int. Una stringa numerica non viene convertita automaticamente e può causare TypeError nel confronto.
Se estendi il contratto dei dati, decidi prima se ammettere decimali, se rifiutare booleani e come trattare input non numerici. Per ammettere precisamente gli interi predefiniti escludendo bool puoi verificare il tipo esplicitamente; per modelli numerici più ampi serve una regola adeguata. Non considerare il solo controllo 0 <= score <= 100 una prova di tutte queste proprietà.
Il totale degli esclusi rende visibile il problema, ma non identifica quali record correggere. Se l’esercizio diventa un programma su dati reali, conserva anche un riferimento alla riga o al record scartato quando serve all’utente per correggerlo.




