0%

Ausdrucksstärkere Funktionen · Übung

Optionale Werte und None

In der vorigen Lektion war False eine echte Einstellung. Sie bedeutete, dass eine bestimmte Art der Bereinigung nicht stattfinden sollte. Das unterscheidet sich davon, überhaupt keine Auswahl zu übergeben.

Manche optionalen Parameter müssen zwei Situationen unterscheiden:

  • Es wurde kein Wert übergeben, daher soll die Funktion einen wählen.

  • Es wurde ein Wert übergeben, daher soll die Funktion ihn beibehalten.

Pythons None gibt uns einen klaren Weg, die erste Situation darzustellen:

def build_feedback(score, total, note=None):
    if note is None:
        note = "Keep practicing."
    return f"{score}/{total}: {note}"

Hier bedeutet note=None nicht, dass jede Notiz None sein muss. Es bedeutet, dass note mit None beginnt, wenn die Funktion ohne dieses Argument aufgerufen wird:

build_feedback(6, 10)

Code kann weiterhin eine Notiz übergeben, wenn er eine hat:

build_feedback(10, 10, note="Perfect score!")

Die Funktion ersetzt None durch ihre eigene Meldung, lässt eine übergebene Notiz aber unverändert.

Prüfe die Identität mit is None

Um festzustellen, ob die Notiz weggelassen wurde, prüfe genau diesen einen Wert:

if note is None:

None ist ein bestimmter Wert, deshalb ist die Identitätsprüfung am klarsten. Eine Wahrheitsprüfung wäre breiter:

if not note:

Wie du in Python-Grundlagen I gelernt hast, gelten None, "", 0 und False alle als falsch. Diese breitere Bedingung würde sie alle als fehlend behandeln, selbst wenn der aufrufende Code einen davon absichtlich übergeben hat.

Zum Beispiel kann ein leerer String bewusst verlangen, dass keine Meldung erscheint:

build_feedback(8, 10, note="")

Der leere String wurde übergeben. Ihn durch eine Standardrückmeldung zu ersetzen würde die Entscheidung des Aufrufers ignorieren.

Warum ist if note is None für diese optionale Notiz besser als if not note?

Ergänze Rückmeldung nur, wenn sie fehlt

Vervollständige build_feedback, indem du diese Unterscheidung in Code umsetzt. Wähle nur dann eine Meldung, wenn note is None gilt. Behalte andernfalls den übergebenen String bei, auch wenn er leer ist.

Aufgabe

Vervollständige build_feedback.

  • Wenn note is None gilt, verwende "Perfect score!", falls score == total gilt.

  • Verwende andernfalls, wenn note is None gilt, "Keep practicing.".

  • Wenn der Aufrufer eine Notiz übergibt, behalte sie genau bei, auch wenn sie "" ist.

  • Gib score/total: note zurück.

Gib innerhalb der Funktion nichts aus.