0%

Ausdrucksstärkere Funktionen · Abschlussprojekt

Abschlussprojekt: Projekt: Konfigurierbare Punkteberechnung und Berichte

In diesem Kapitel hast du Funktionen leichter verständlich und anpassbar gemacht, ohne Klassen einzuführen. Du hast nützliche Standardwerte ergänzt, wichtige Entscheidungen benannt, einen fehlenden Wert mit None dargestellt, Regeln dokumentiert, Berechnung von Ausgabe getrennt und eine Funktion als Auswahl übergeben.

Dieses Projekt bringt diese Ideen zum Quizprogramm aus Kapitel 1 zurück. Diese Version verwendete eine feste Vergleichsregel und einen festen Bericht. Die überarbeitete Version verwendet weiterhin Dictionarys, aber ihre Funktionen lassen den umgebenden Code mehr von ihrem Verhalten wählen.

Die Arbeit durchläuft eine kurze Folge:

  1. Wähle eine Funktion zum Vergleichen von Antworten.

  2. Berechne die Punktzahl und den optionalen Bonus.

  3. Erstelle einen Bericht aus der zurückgegebenen Punktzahl.

Dabei verwendest du die Ideen des Kapitels erneut:

  • Ein Funktionswert wählt das Verhalten beim Antwortvergleich.

  • Ein Standardwert macht den exakten Vergleich zur üblichen Auswahl.

  • Ein Bonus als reiner Schlüsselwortparameter macht eine wichtige Anpassung ausdrücklich sichtbar.

  • None kennzeichnet eine weggelassene Berichtsnotiz.

  • Typhinweise und Docstrings halten öffentliche Zusagen fest.

  • Reine Funktionen geben Ergebnisse zurück, statt sie auszugeben.

Die vorgegebenen Vergleichsfunktionen

Der exakte Vergleich berücksichtigt jedes Zeichen:

def exact_match(response, expected):
    return response == expected

Der flexible Vergleich bereinigt beide Werte:

def flexible_match(response, expected):
    return response.strip().lower() == expected.strip().lower()

score_attempts soll eine dieser Funktionen erhalten und sie für jeden Versuch aufrufen.

Der Datenvertrag

Jedes Dictionary für einen Versuch hat drei Schlüssel:

{
    "response": " DEF ",
    "expected": "def",
    "points": 2,
}

Wenn die gewählte Vergleichsfunktion True zurückgibt, addiere die Punkte dieses Versuchs. Addiere den Bonus als reines Schlüsselwortargument einmal, nachdem alle Versuche geprüft wurden.

Eine reine Funktion zum Erstellen des Berichts

build_report soll zwei Zeilen zurückgeben:

Practice: 6/6
Perfect score!

Wenn note weggelassen wird, wähle "Perfect score!" bei voller Punktzahl und andernfalls "Keep practicing.". Behalte eine übergebene Notiz genau bei.

Bringe den Ablauf der Punkteberechnung in die richtige Reihenfolge:

Ziehe die Optionen in die richtige Reihenfolge oder verwende die Pfeiltasten.

  • Gib die Punktzahl zurück.

  • Addiere den einmaligen Bonus.

  • Addiere Punkte für erfolgreiche Übereinstimmungen.

  • Rufe die Vergleichsfunktion für jede eingegebene und erwartete Antwort auf.

  • Erhalte Versuche und eine Vergleichsfunktion.

  • Übergib die Punktzahl an eine getrennte Funktion zum Erstellen des Berichts.

Lass die Funktionen mit neuen Daten arbeiten

Die verdeckten Prüfungen verwenden andere Versuche und können eine andere Vergleichsfunktion übergeben. Schreibe jede Funktion anhand ihrer beschriebenen Regeln und nicht anhand der Werte im sichtbaren Beispiel.

Behalte für diese Lösung den Aufbau mit Funktionen bei. Kapitel 4 greift denselben Quizbereich wieder auf, nachdem diese prozedurale Version klar funktioniert.

Aufgabe

Vervollständige score_attempts und build_report.

score_attempts:

  • Behalte matcher=exact_match als Standardwert bei.

  • Behalte bonus als reinen Schlüsselwortparameter bei.

  • Behalte den vorgegebenen Docstring bei.

  • Rufe matcher(response, expected) für jeden Versuch auf.

  • Addiere die Punkte übereinstimmender Antworten und anschließend einmal bonus.

  • Gib die Zahl zurück, ohne etwas auszugeben.

build_report:

  • Behalte die vorgegebenen Typhinweise für score, total, label und den Rückgabewert sowie den Docstring bei.

  • Wähle nur dann eine Notiz, wenn note is None gilt.

  • Verwende bei voller Punktzahl "Perfect score!" und andernfalls "Keep practicing.".

  • Gib label: score/total, einen Zeilenumbruch und die Notiz zurück.

Das sichtbare Beispiel sollte nach flexiblem Vergleich und einem Bonuspunkt die volle Punktzahl anzeigen.