Python-Kurs / Punkte prüfen und Durchschnitt sowie bestandene Leistungen berechnen

Eine Punkteauswertung verbindet Datenprüfung, Bestehensentscheidung und Durchschnittsberechnung. Ungültige Werte werden aus der Statistik ausgeschlossen und zugleich gezählt, damit erkennbar bleibt, wie viele Eingaben nicht in das Ergebnis eingehen.

Gültigkeitsbereich und Bestehensgrenze festlegen

Für diese Übung liegen die Punkte bereits als Liste ganzer Zahlen vor. Gültig sind 0 bis einschließlich 100 Punkte; ab einschließlich 60 Punkten gilt eine Leistung als bestanden. Das Einlesen von Text, etwa aus CSV-Dateien, und die Entscheidung über dessen Umwandlung sind vorgelagerte Aufgaben. Eine negative Zahl und ein Wert über 100 erhöhen hier nur den Fehlerzähler.

Eingabe oder Zustand Behandlung
0 Gültiger Punktwert, nicht bestanden
59 Gültig, unmittelbar unter der Bestehensgrenze
60 und 100 Gültig und bestanden
-1 und 101 Als ungültig zählen, aus dem Durchschnitt ausschließen
Keine gültigen Punkte Meldung ausgeben und keinen Durchschnitt berechnen

Diese Regeln sollten feststehen, bevor Sie den Code schreiben. Insbesondere sind „keine gültigen Daten“ und „ein gültiges Ergebnis mit 0 Punkten“ verschiedene Fälle. Die Übung zu Vergleichen und Wahrheitswerten erklärt, warum beide Fälle nicht allein am Wahrheitswert einer einzelnen Zahl unterschieden werden können. Die Python-Einführung zu Bedingungen und Schleifen beschreibt den dafür verwendeten Kontrollfluss.

Die vollständige Punkteauswertung ausführen

Speichern Sie scores.py mit folgendem vollständigem Inhalt in UTF-8 im Übungsordner. Führen Sie python scores.py im ausgewählten Projektinterpreter aus. Unter macOS oder Ubuntu kann außerhalb einer aktivierten Umgebung python3 der passende Befehl sein. Zusatzpakete und externe Dateien sind nicht nötig.

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")

Erwartete Ausgabe:

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

Die gültigen Punkte sind 80, 60, 0 und 100. Ihre Summe ist 240; geteilt durch vier ergibt sie 60.0. Drei dieser vier Werte erreichen die Bestehensgrenze. Die beiden anderen Eingaben werden als ungültig gemeldet. Die englischen Ausgabebezeichnungen gehören zum unveränderten Übungscode.

Zähler und Nenner getrennt nachvollziehen

invalid zählt verworfene Eingaben, passed dagegen nur bestandene Leistungen innerhalb des gültigen Bereichs. Die verneinte verkettete Bedingung not 0 <= score <= 100 verwirft Werte außerhalb der beiden eingeschlossenen Grenzen. Danach verhindert continue, dass diese Werte in valid oder den Bestehenszähler gelangen.

Die 0 wird ausdrücklich in valid aufgenommen. Würden Sie stattdessen mit if score nur wahre Zahlenwerte zulassen, ginge diese gültige Leistung verloren und der Durchschnitt würde verfälscht. Umgekehrt ist if valid an der späteren Stelle richtig: Dort wird geprüft, ob die gesamte Liste mindestens ein Element enthält. Auch [0] ist eine nichtleere und damit wahre Liste.

Erst nach dem Sammeln berechnet sum(valid) / len(valid) den Durchschnitt der akzeptierten Werte. Der Nenner ist die Anzahl der gültigen Werte, nicht die Anzahl aller Eingaben. Die leere Liste gelangt in den else-Zweig; dadurch entsteht keine Division durch null. Die Formatierung :.1f zeigt eine Dezimalstelle an, ändert aber nicht die gespeicherten Punkte. Die Referenz zu sum beschreibt die verwendete Summenbildung.

Prüfen Sie als zusätzliche Kontrolle: Anzahl gültig plus Anzahl ungültig muss der ursprünglichen Eingabeanzahl entsprechen. Der Bestehenszähler darf nie größer als die Zahl gültiger Werte sein. Eine solche Abstimmung hilft, versehentlich ausgelassene oder doppelt gezählte Daten zu erkennen.

Grenzwerte prüfen und die Typannahme beibehalten

  1. Ersetzen Sie nur die erste Zuweisung durch scores = []. Erwarten Sie valid: 0 invalid: 0 und no valid scores, ohne Durchschnitt und ohne Bestehenszeile.
  2. Testen Sie [59, 60, 61]. Alle drei Werte sind gültig, der Durchschnitt ist 60.0 und zwei bestehen. Ändern Sie versuchsweise score >= 60 zu score > 60: Nun besteht nur noch einer. Stellen Sie den ursprünglichen Operator wieder her.
  3. Verwenden Sie [-1, 101]. Beide Werte sind ungültig; es darf kein Durchschnitt erscheinen. Testen Sie anschließend [0]: ein gültiger Wert, Durchschnitt 0.0 und null bestandene Leistungen.
  4. Prüfen Sie die eingeschlossenen Grenzen mit [0, 100]. Erwartet werden zwei gültige Werte, Durchschnitt 50.0 und eine bestandene Leistung.
  5. Stellen Sie die ursprüngliche Liste wieder her und gleichen Sie sämtliche Ausgabezeilen mit dem Beispiel ab.

Die Bereichsprüfung beweist keine Ganzzahligkeit. Ein Wert wie 60.5 würde akzeptiert, während "60" als Zeichenkette beim Vergleich einen TypeError auslöst. Auch True und False können als 1 und 0 durch die Prüfung gelangen, weil bool eine Unterklasse von int ist. Die Dokumentation zum bool-Typ erklärt diese Beziehung.

Wenn ausschließlich gewöhnliche eingebaute ganze Zahlen erlaubt sein sollen, können Sie vor dem Bereichsvergleich zusätzlich type(score) is not int als Ablehnungsbedingung prüfen und mit or verknüpfen. Dadurch werden auch boolesche Werte und andere Typen vor dem numerischen Vergleich ausgesondert. Ob Unterklassen oder Dezimalpunkte erlaubt sein sollen, ist eine bewusste Eingaberegel; erweitern Sie die Prüfung erst nach dieser Entscheidung. Für die unveränderte Übung gilt weiterhin die anfängliche Annahme einer Ganzzahlliste.