Kapitel 8
Eigene Funktionen schreiben
Eine Aufgabe in eine Funktion verwandeln
Am Ende von Kapitel 7 hast du ein Menü gebaut, das Einträge hinzufügen, auflisten und zählen konnte. Es funktionierte, aber seine Schleife musste jedes Detail erklären:
while True:
command = input("Command: ").strip().lower()
if command == "add":
# ask for an item, store it, and confirm it
...
elif command == "list":
# handle an empty list or print every numbered item
...
elif command == "count":
# report the number of items
...
Um den Befehl list zu verstehen, muss man den entsprechenden Zweig finden und alle Zeilen darin lesen. Die Schleife übernimmt zwei Aufgaben gleichzeitig: Sie wählt eine Aktion aus und erklärt, wie jede einzelne Aktion funktioniert.
Du weißt schon, was das verbessern könnte.
if command == "add":
add_item(items)
elif command == "list":
show_items(items)
elif command == "count":
show_count(items)
Auch wenn du noch nicht weißt, wie diese drei Funktionen definiert sind, kannst du den Plan lesen. Jeder Name beantwortet die Frage: „Was passiert bei diesem Befehl?“
Das ist der wichtigste Grund, eine Funktion zu schreiben: Sie gibt einem verständlichen Vorgang einen Namen.
Du verwendest bereits Funktionen
In Kapitel 3 hast du Funktionsaufrufe kennengelernt:
name = input("What is your name? ")
letter_count = len(name)
print(letter_count)
input, len und print sind Funktionen. Du kennst drei wichtige Aspekte ihres Verhaltens:
Ein Aufruf verwendet Klammern, wie in
len(name).Ein Aufruf kann ein Argument erhalten, zum Beispiel
name.Ein Aufruf kann einen Rückgabewert liefern, zum Beispiel die Zahl von
len(name).
Bisher hat jemand anderes jede Funktion geschrieben, die du aufgerufen hast. Dieses Kapitel zeigt dir die andere Hälfte: wie du eigene Funktionen definierst.
Erst definieren, dann aufrufen
Eine Funktionsdefinition beginnt mit def. Sie beschreibt, was beim Aufruf der Funktion passieren soll:
Die Definition besteht aus zwei Teilen:
def show_count(items):
Diese erste Zeile gibt der Funktion ihren Namen und legt fest, welche Informationen sie erwartet.
print(f"Items stored: {len(items)}")
Der eingerückte Funktionskörper enthält die eigentliche Arbeit.
Beim Definieren der Funktion wird diese Arbeit noch nicht ausgeführt. Python merkt sich die Definition. Die Arbeit passiert später, beim Aufruf:
show_count(books)
Diese Trennung ist nützlich. Definiere einen Vorgang einmal und rufe ihn dann überall dort auf, wo das Programm ihn braucht.
Ein Name schafft eine nützliche Detailstufe
Stell dir eine Anweisung vor, die so lautet:
Bewege deinen rechten Fuß, verlagere dein Gewicht, bewege deinen linken Fuß, verlagere dein Gewicht und wiederhole das immer weiter.
Die meisten Menschen würden einfach sagen:
Geh zur Tür.
Die kürzere Anweisung ist hilfreich, weil das Wort gehen einen vertrauten Vorgang benennt. Ein guter Funktionsname tut dasselbe für Code. So kann ein Teil des Programms den Plan beschreiben, während die Details im Funktionskörper stehen.
Funktionen verbessern ein Programm nicht automatisch. Ein vager Name wie do_thing() verbirgt Informationen. Ein klarer Name wie show_items() macht die Absicht deutlich.
In diesem Kapitel lernst du, die Details zu schreiben und die Namen zu wählen.
Was gibt dieses Programm aus?
def announce():
print("The gate is open.")
print("Ready.")
Welcher Funktionsname fasst seine Aufgabe am deutlichsten zusammen?