Eigene Funktionen schreiben · Übung
Funktionen zusammenarbeiten lassen
Eine Funktion kann eine andere Funktion aufrufen. Damit kannst du einen größeren Vorgang aus kleineren, benannten Teilen zusammensetzen.
Angenommen, bei einem Menütitel sollen die umgebenden Leerzeichen entfernt und alle Buchstaben in Großbuchstaben umgewandelt werden:
def clean_title(text):
return text.strip().upper()
Eine zweite Funktion kann dieses Ergebnis verwenden:
def make_heading(text):
clean = clean_title(text)
return f"=== {clean} ==="
Anschließend startet das Programm die gesamte Kette mit einem Aufruf:
heading = make_heading(" reading list ")
print(heading)
Die Aufrufe erfolgen in dieser Reihenfolge:
Das Programm ruft
make_headingauf.make_headingruftclean_titleauf.clean_titlegibt"READING LIST"anmake_headingzurück.make_headingerstellt"=== READING LIST ==="und gibt es an das Programm zurück.Das Programm speichert das Ergebnis und gibt es aus.
Jede Funktion hat eine klar umrissene Aufgabe. clean_title weiß, wie der Text bereinigt wird. make_heading weiß, wie das bereinigte Ergebnis ausgeschmückt wird.
Warum nicht alles in eine Funktion schreiben?
Diese Version ist kürzer:
def make_heading(text):
return f"=== {text.strip().upper()} ==="
Bei einem kleinen Ausdruck kann das durchaus verständlich sein. Getrennte Funktionen werden wertvoll, wenn:
ein Vorgang einen nützlichen Namen hat;
der Vorgang an mehr als einer Stelle benötigt wird;
jeder Teil für sich geprüft werden sollte;
die Aufteilung eine größere Funktion leichter lesbar macht.
Mache nicht aus jeder Zeile eine Funktion. Ziehe Grenzen, die beim Verstehen des Programms helfen.
Rückgabewerte verbinden Funktionen
Beachte, dass clean_title Text zurückgibt. Sie gibt ihn nicht aus. make_heading braucht diesen Text, um einen weiteren Wert zu erstellen. Deshalb ist ein Rückgabewert die richtige Verbindung.
Würde clean_title den Text nur ausgeben, würden diese Zeilen innerhalb von make_heading die falsche Überschrift erstellen:
clean = clean_title(text)
return f"=== {clean} ==="
clean würde None enthalten, daher wäre der zurückgegebene String "=== None ===". Der Code würde laufen, aber nicht den bereinigten Namen zurückgeben.
Die Ideen aus den letzten drei Lektionen greifen ineinander:
Parameter bringen Informationen in eine Funktion;
lokale Variablen speichern ihre Zwischenergebnisse;
Rückgabewerte bringen nutzbare Ergebnisse zurück zum aufrufenden Code;
eine andere Funktion kann dieser aufrufende Code sein.
Welche Funktion erhält den Wert "map" direkt von clean_word?
def clean_word(text):
return text.strip().lower()
def make_label(text):
word = clean_word(text)
return f"[{word}]"
label = make_label(" Map ")
Aufgabe
Vervollständige zwei Funktionen, die zusammenarbeiten:
clean_name(text)gibt den Text ohne umgebende Leerzeichen und mit allen Buchstaben in Großschreibung zurück.make_heading(text)ruftclean_name(text)auf und gibt den bereinigten Namen zwischen===und===zurück.
Behalte den vorhandenen Aufruf und die Ausgabeanweisung bei.
Erwartete Ausgabe:
=== READING LIST ===
Wenn die Übung bestanden ist, verwende Step im Übungseditor. Verfolge die Ausführung vom Aufruf auf der obersten Programmebene in make_heading, dann in clean_name und über beide Rückgabewerte wieder zurück.