At My Fingertips
Rapid Playground
Bisher haben wir Code verfasst, den wir, einmal geschrieben, nur noch auf mühsame und fehleranfällige Weise wiederverwenden konnten. Die Wiederverwendung von Code ist aber etwas, das Programmierer*innen immer und immer wieder machen. Wir sind eigentlich Profi-Copy-Paster. Und wir als Profi-Copy-Paster haben deshalb auch effizientere Möglichkeiten entwickelt, Code wiederzuverwenden.
Eine Möglichkeit dazu sind Funktion. Sie kennen Funktionsaufrufe bereits:
show_graphic(rectangle(100, 200, red))
Diese Zeile besteht gleich aus zwei Funktionsaufrufen: show_graphic
und rectangle
. Die Funktionsdefinition - also der Code, der definiert, was passieren soll, wenn man diese Funktionen aufruft - haben wir noch nicht betrachtet. Wir können aber selbst einmal eine solche Funktionsdefinition verfassen.
Mit einer kreis
-Funktion könnte man das Erstellen eines Kreises vereinfachen, da man den Durchmesser nicht mehr zweimal (identisch) eingeben muss, sondern nur noch einmal.
In folgender Codezelle sehen Sie eine Funktionsdefinition, die eine solche Funktion definiert:
Wenn Sie auf Ausführen/ Run klicken, passiert aber noch nichts sichtbares. Der Compiler hat sich den Code unter dem Namen kreis
zwar gemerkt, aber noch nicht ausgeführt. Die Funktionsdefinition kreis
muss zuerst noch aufgerufen werden.
kreis_blaeulich = kreis(200 , rgb_color(0, 127, 255))
from pytamaro import above
kreis_0 = kreis(50, rgb_color(127, 0, 255))
kreis_1 = kreis(100, rgb_color(127, 100, 255))
kreis_2 = kreis(150, rgb_color(127, 200, 255))
bild = above(
above(kreis_0, kreis_1),
kreis_2
)
show_graphic(bild)
Wir können also einmal definierten Code über Funktionen (und Variablen) wiederverwenden. Auf dieser Website könne wir auch Funktionen ganz einfach in einer eigenen Bibliothek ablegen und in anderen Aktiväten wieder verwenden. Diese Toolbox lernen wir in den kommenden Aktivitäten nutzen.
Jetzt geht es zuerst darum, Funktionen selbst besser zu verstehen, damit wir sie benutzen können.
Wenn wir von Funktionen sprechen, meinen wir meist zwei Dinge:
Eine Definition darf bestehen, ohne je aufgerufen zu werden; der Code kann also kompilieren (durchlaufen werden), ohne dass es zu Fehlermeldungen kommt. Nicht verwendete Funktionen sind jedoch recht sinnlos und gute Programmierumgebungen weisen darauf hin.
Eine Funktion wird verwendet, indem sie vom Aufrufer (Caller) aufgerufen (call) wird. Wenn jedoch eine Funktion aufgerufen wird, ohne dass sie definiert wurde, gibt der Compiler sofort eine Fehlermeldung aus, z. B. wenn Sie beim Funktionsaufruf einen Schreibfehler gemacht haben:
show_graphic(kreis(100, black))
Seit kurzem bietet die Website PyTamaro-Web auch automatisch erstellte Dokumentationen für selbst definierte Funktionen an (im Bild oben gelb markiert).
Die Schlüsselwörter lassen den Compiler wissen, dass einerseits eine Funktionsdefinition jetzt beginnt (def), und andererseits, dass sie jetzt endet (return) und den Rückgabewert zurückgibt.
Nach dem Schlüsselwort def folgt immer der Definitionsname, der aus den gleichen Zeichen bestehen darf wie Variablennamen.
In den Klammern darauf kommt irgendeine Anzahl von Parametern. Das Klammerpaar darf also leer sein oder eine unendliche grosse Anzahl Parameter beinhalten. Für uns werden es meist 1-4 Parameter sein. Am Schluss muss der Doppelpunkt : folgen. Er signalisiert das Ende des Definitionskopfes (erste Zeile). Alles, was danach zur Definition (dem Funktionskörper) gehört, ist (um 4 Leerzeichen) eingerückt, auf Englisch indented.
Eine reine Funktion gibt ihre Veränderungen nur über die Rückgabeanweisung zurück: Die letzte Zeile beginnt mit dem Schlüsselwort return und darauf folgt genau ein Rückgabewert, nie mehr oder weniger.
Eine Funktion darf zwar auch ohne die return-Zeile enden, im Moment arbeiten wir aber nur mit Funktionen mit return
.
Beide Funktionen in der obigen Darstellung sind gleichwertig: Man ruft beide mit kreis(irgendeine_zahl, irgendeine_farbe)
auf und erhält bei gleicher Eingabe die gleiche Ausgabe. Sie unterschieden sich nur in ihrem Aufbau, also dass die obere Funktion in einem Zwischenschritt den Rückgabewert der Variable grafik
zuweist.
Wie eine Schleife kann auch die Funktion in Kopf (erste Zeile) und Körper (das Eingerückte) eingeteilt werden. Wenn die letzte Zeile mit return beginnt, ist diese Zeile die Rückgabeanweisung.
Lösung
from pytamaro import beside
def zwei_kreise_0():
ein_kreis = kreis(23 * 2, red)
bild = beside(ein_kreis, ein_kreis)
return bild
Erklärung
Beim Aufruf der Funktion zwei_kreise_1
wird zwar jeweils eine Farbe an die Definition übergeben (red
, rgb_color
etc.), jedoch wird dieser Wert nie verwendet. Stattdessen werden die Kreise immer mit red
erstellt. Ersetzen Sie deshalb die Konstante red
im Funktionskörper mit dem Parameter farbe
, der vom Funktionsaufruf über den Funktionskopf übergeben wird.
ein_kreis = kreis(23 * 2, farbe)
Erklärung
Verwenden Sie im Funktionskörper beide Parameter radius und farbe beim Erstellen der Kreise, damit die Grafik jeweils in passenden Farben und Grössen erstellt wird.
from pytamaro import above
def zwei_kreise(radius, farbe):
ein_kreis = kreis(radius * 2, farbe)
bild = above(ein_kreis, ein_kreis)
return bild
Die Anzahl Parameter in der Definition muss mit der Anzahl Argumente im Aufruf übereinstimmen, sonst kommt es zu Fehlermeldungen.
def f_1(zahl_0, zahl_1):
return zahl_0 + zahl_1
print(f_1(2, 3))
Um solche Fehlaufrufe zu verhindern, wird oft noch der Datentyp im Funktionskopf festgelegt. So weiss man, welche Datentypen gemeint sind, und Fehler können früher erkannt werden.
Lesen Sie dazu folgende Codezellen und führen Sie sie anschliessend aus:
Korrigieren Sie den Code in folgender Zelle.
kreis_datentypen(100, rgb_color(120, 0, 244))
This activity has been created by Gall and is licensed under CC BY-SA 4.0.
Funktionen: Einführung
PyTamaro is a project created by the Lugano Computing Education Research Lab at the Software Institute of USI
Privacy Policy • Platform Version e1c4550 (Sun, 23 Feb 2025 15:42:54 GMT)