0%

Ausdrucksstärkere Funktionen · Übung

Reine Funktionen und Seiteneffekte

In der vorigen Lektion hat die Funktion percentage einen Wert zurückgegeben, statt ihn auszugeben. Dadurch kann der Rest des Programms entscheiden, ob er das Ergebnis anzeigt, speichert oder in einer weiteren Berechnung verwendet.

Vergleiche diesen Entwurf mit einer Funktion, deren einzige Aufgabe die Ausgabe ist. Der Unterschied führt zwei nützliche Ideen ein: Berechnung und Seiteneffekte.

Diese Funktion baut eine Zeile mit einer Punktzahl und gibt sie zurück:

def score_line(score, total):
    return f"Score: {score}/{total}"

Für dieselben Argumente liefert sie dasselbe Ergebnis. Sie gibt nichts aus, fragt keine Eingabe ab und ändert keine Daten außerhalb der Funktion. Eine Funktion mit diesen Eigenschaften heißt reine Funktion.

Vergleiche sie jetzt mit einer Funktion, die die Zeile sofort anzeigt:

def show_score(score, total):
    print(f"Score: {score}/{total}")

Die Ausgabe verändert die sichtbare Programmausgabe und ist damit ein Seiteneffekt. Weitere Seiteneffekte sind das Verändern einer übergebenen Liste, das Schreiben einer Datei und das Senden einer Netzwerkanfrage.

Seiteneffekte sind keine Fehler. Ein nützliches Programm muss irgendwann etwas anzeigen, speichern oder senden. Die Entwurfsentscheidung ist, ob Berechnung und Aktion vermischt oder an getrennten Stellen gehalten werden.

Trenne das Erstellen vom Anzeigen

Vergleiche diese Ansätze für eine Themenbeschriftung:

def show_topic(number, topic):
    print(f"{number}. {topic}")
def build_topic_label(number, topic):
    return f"{number}. {topic}"


print(build_topic_label(2, "Functions"))

Der zweite Entwurf erstellt zuerst den Text und zeigt ihn danach an. Da der zurückgegebene Text ein gewöhnlicher Wert ist, kannst du ihn speichern und untersuchen:

label = build_topic_label(2, "Functions")
print(label)
print(label == "2. Functions")

Der Vergleich gibt True aus. Das bestätigt, dass die Funktion den erwarteten Text zurückgegeben hat. Eine Webseite, ein Terminalprogramm oder ein späterer Dateiexport kann denselben Rückgabewert wiederverwenden.

Reine Funktionen verringern auch Überraschungen. Ein Aufruf von build_topic_label erzeugt keine heimliche Ausgabe.

Welche Funktion ist rein?

Strukturiere eine Berichtsfunktion um

Das Ausgangsprogramm vermischt das Erstellen und Anzeigen eines Berichts in einer Funktion. Strukturiere es so um, dass build_report nur den Text zurückgibt, während das abschließende print außerhalb der Funktion bleibt.

Aufgabe

Strukturiere das Programm um.

  • Benenne show_report in build_report um.

  • Lass es name: score/total zurückgeben, statt es auszugeben.

  • Gib innerhalb von build_report nichts aus.

  • Gib unten den Wert aus, den build_report("Mina", 8, 10) zurückgibt.

Die verdeckten Prüfungen rufen die Funktion auch mit unbekannten Werten auf.