0%

Vom funktionierenden Code zum Programmentwurf · Übung

Die Kosten informeller Dictionary-Strukturen

Ein Dictionary akzeptiert fast jeden Aufbau. Deshalb erlaubt Python dir, jeden dieser Werte zu erstellen:

good = {
    "prompt": "Two plus two?",
    "answer": "4",
    "points": 1,
}

missing_answer = {
    "prompt": "Three plus three?",
    "points": 1,
}

wrong_points = {
    "prompt": "Four plus four?",
    "answer": "8",
    "points": -5,
}

Die Dictionarys sind gültige Python-Werte. Nach den Anforderungen unseres Programms ist aber nur das erste eine gültige Quizfrage.

Dieser Unterschied ist wichtig:

  • Python prüft die Dictionary-Syntax.

  • Dein Programm muss die Bedeutung und den erwarteten Aufbau prüfen.

Erstelle Datensätze mit einer Funktion

Eine Erzeugungsfunktion kann einen verlässlichen Aufbau festlegen:

def make_question(prompt, answer, points):
    return {
        "prompt": prompt,
        "answer": answer,
        "points": points,
    }

Die Funktion wird zum normalen Weg, Fragen zu erstellen. Sie kann ungeeignete Werte ablehnen, bevor sie einen nur teilweise brauchbaren Datensatz zurückgibt.

Python-Grundlagen I hat raise als Mittel eingeführt, mit dem eine Funktion meldet, dass sie kein normales Ergebnis erzeugen kann. Hier verwendet die Erzeugungsfunktion dasselbe Werkzeug, um die Regeln für eine gültige Frage zu schützen:

if not prompt.strip():
    raise ValueError("A question needs a prompt")

Nach .strip() wird aus einem leeren oder nur mit Leerraum gefüllten Fragetext der leere String "". In Python-Grundlagen I hast du gelernt, dass ein leerer String als falsch gilt. Daher macht not die Ablehnungsbedingung wahr.

Das verbessert den Entwurf und behält dabei vertraute Dictionarys bei. Jeder Programmteil kann Fragedatensätze mit denselben Schlüsseln und geprüften Werten erhalten.

Was verbessert make_question?

Das ist bereits für sich ein nützlicher Entwurf. Eine Funktion gibt dem Programm jetzt eine einheitliche Möglichkeit, Fragedatensätze zu erstellen.

Aufgabe

Vervollständige make_question.

Lehne einen leeren Fragetext, eine leere Antwort und Punkte unter 1 ab, indem du einen ValueError auslöst. Gib andernfalls ein Dictionary mit genau den Werten prompt, answer und points zurück, die der Aufrufer übergeben hat.