Level 4: Funktionen selbst schreiben #
In Level 2 hast Du gelernt, wie sich mit Wiederholungen viel Tipparbeit sparen lässt. Nun wirst Du ein Konzept kennenlernen, das uns ebenfalls eine Menge Arbeit abnehmen kann und unseren Code sehr übersichtlich strukturieren wird.
Die Absicherung verbessern #
Zunächst einmal möchte ich noch einmal ein bekanntes Problem zur Sprache bringen. Du hast hoffentlich schon einen Weg gefunden, eine Antwort einzulesen, und sie nur zu akzeptieren, wenn sie entweder »a«, »b«, »c« oder »d« war. (Falls nicht: das war Thema der Aufgabe aus Level 2: Wiederholungen mit Bedingung.)
Mit deinem neuen Wissen über Listen lässt sich dies nun noch einfacher bewerkstelligen. Sieh’ dir einmal diese Zeilen an:
antwort = input('Gib ein: a, b, c oder d: ')
while not antwort in ['a', 'b', 'c', 'd']:
antwort = input('Nicht verstanden – a, b, c oder d? ')
print(antwort)
Wenn du glaubst, verstanden zu haben, was hier passiert, lass den Code einmal laufen und überprüfe deine Vermutung.
Warum ist das besser? #
Der Codeabschnitt hier kümmert sich nur um eine Sache: die Überprüfung der Antwort. Der Lösungsvorschlag aus Level 2 hat außerdem noch Punkte vergeben. (Wie wir das wieder hinbekommen, sehen wir uns später an.) Hier wird außerdem der Sinn des ganzen Abschnitts in einer Zeile dargestellt: while not antwort in ['a', 'b', 'c', 'd']:
macht schon beim Lesen klar, was hier überprüft wird. Das zweite solltest du immer anstreben: möglichst einfach, klar und kurz ausdrücken, was gemeint ist.
Aber auch die Konzentration auf nur eine Sache ist etwas gutes. Indem du viele Abschnitte, die jeweils nur eine Sache machen, miteinander verbindest, wirst du dein Programm übersichtlich strukturieren können und damit weniger Fehler machen. Darum soll es in diesem Level gehen.
Funktionen müssen nur einmal geschrieben werden! #
Vielleicht hast du schon einen Persönlichkeitstest mit mehreren Fragen programmiert? Sicher ist dir dabei aufgefallen, wie lästig es ist, immer wieder ähnlichen Code (wie den oben) neu zu schreiben (oder zu kopieren).
Immer dann, wenn Code mehr als einmal verwendet werden kann, wird es sinnvoll sein, eine eigene Funktion zu schreiben. Das sieht dann z.B. so aus:
def hole_antwort():
antwort = input('Gib ein: a, b, c oder d: ')
while not antwort in ['a', 'b', 'c', 'd']:
antwort = input('Nicht verstanden – a, b, c oder d? ')
print(antwort)
Übernimm diesen Code in eine Datei funktion.py
, und versuche, ihn laufen zu lassen.
Du wirst sehen, dass sichtlich nichts passiert. Funktioniert die Funktion nicht?
An der Funktion ist nichts falsch, nur wurde sie noch nicht ausgeführt! Mit dem Schlüsselwort def
definieren wir die Funktion: du schreibst auf, was passieren soll, wenn du selbst oder jemand anders deine Funktion aufruft. Ausgeführt wird sie allerdings erst, wenn das tatsächlich jemand macht!
Wenn du das Programm gestartet hast, dann gib doch einmal folgendes in der Python-REPL ein – deine Funktion sollte nämlich nun verfügbar sein:
>>> hole_antwort()
Damit ist schon etwas gewonnen! Wann immer du in einem Programm nun nur eine Auswahl von a, b, c oder d erlauben möchtest, reicht es, hole_antwort()
aufzurufen, und du sparst dir die wiederholte Eingabe!
Schreibweise für Namen von Funktionen
Üblicherweise bekommen Funktionen in Python-Programmen Namen, die nur Kleinbuchstaben enthalten und von Unterstrichen getrennt werden. Auch die meisten Variablen erhalten auf diese Weise geschriebene Namen. Diese Schreibweise heißt dann auch passenderweise snake-case.
Nicht verwendet werden darf übrigens der Bindestrich
-
– der würde als Minuszeichen interpretiert und damit das Programm durcheinanderbringen.
Übung: Nächste Frage! #
Um die Fragen im Psycho-Test schön zu trennen, sollen folgende Zeilen ausgegeben werden:
-------------------------------
--Und nun zur nächsten Frage!--
-------------------------------
Schreibe eine Funktione, die das für dich erledigt!
Tipp 1
def
vergibst du selbst einen aussagekräftigen Namen, gefolgt von einem Klammerpaar ()
und einem Doppelpunkt :
– ohne das geht es nicht!
Tipp 2
while
-Wiederholung, einer Überprüfung mit if
oder etwas ähnlichem), wird weiter eingerückt.
Lösungsvorschlag
def trenner_ausgeben():
print('-------------------------------')
print('--Und nun zur nächsten Frage!--')
print('-------------------------------')
print()
trenner_ausgeben()
trenner_ausgeben()
Die letzten beiden Zeilen rufen die Funktion auf – nun ist trenner_ausgeben
jederzeit verfügbar!