Kapitel V - Funktionen
Additum: Funktionen mit Parametern
Wir haben Funktionen und Methoden kennengelernt, die Argumente benötigen. Beispielsweise die Funktion print() oder die Methoden forward() oder left() von Objekten der Klasse Turtle. Dabei ist anzumerken, dass die beiden genannten Methoden genau ein Argument benötigen. Die genannte print()-Funktion kann beliebig viele Argumente haben - auch keins. Dann wird entsprechend eine Leerzeile ausgegeben.
Im Rahmen des aktuellen Kapitels haben wir uns damit beschäftigt, wie man eigene Funktionen definieren kann. Die von uns definierten Funktionen haben bisher aber noch keine Argumente übergeben bekommen. Von der Definition der Funktionen wäre die Übergabe eines Argumentes nicht möglich gewesen. Dies wäre sicherlich praktisch, wenn wir das auch könnten. So brauchen wir zum Zeichnen eines Quadrates nicht mehr zuerst die Seitenlänge in einer Variablen zu speichern und dann in der Funktion zu verwenden, sondern wir könnten die gewünschte Seitenlänge direkt als Argument mitgeben und das passende Quadrat der entsprechenden Größe zeichnen lassen.
Folglich würden die beiden Anweisungen
laenge=100quadrat()
zu der folgenden Anweisung "verschmelzen"
quadrat(100)
und wir hätten eine Funktion, die eine vorherige Variablenbelegung nicht benötigt.
Die entsprechenden Argumente werden genau dort "festgelegt", wo man sie auch später einsetzt:
# Kopf der Funktiondef myFunction(parameter1, parameter2, parameter3, ...):# Beginn Funktionskörper# Hier können die Variablen parameter1 etc. verwendet werden ...# ...# Letzte Zeile des Funktionskörpers# Diese Zeile gehört nicht mehr zum Funktionskörper
Die Argumente, die für die Funktionsausführung benötigt werden, werden ganz einfach zwischen die beiden Klammern im Funktionskopf geschrieben, vgl. dazu das veränderte Muster der Funktionsdefinition. Das können beliebig viele sein. Zu beachten ist, dass diese gültige Variablennamen sein müssen. Mit den Variablen, die im Funktionskopf festgelegt wurden, können wir nun im Funktionskörper, also dem entsprechenden Anweisungsblock, arbeiten. Wichtig ist, dass die Variablen nur innerhalb des Funktionskörpers zur Verfügung stehen. Im restlichen Programm kann man diese nicht verwenden, da sie nicht existieren. Um Verwechslungen zu vermeiden, sollte man keine Bezeichnungen nutzen, die man im restlichen Programm bereits verwendet. Ebenfalls sollte man darauf achten, aussagekräftige Namen zu verwenden.
Die Argumente der Funktion, die innerhalb des Funktionskopfes festgelegt werden, nennt man auch Parameter. Die vorhandenen Parameter müssen beim Aufruf der Funktion durch konkrete Werte, also Argumente, belegt werden. Es kann zu gewünschten oder unerwünschten "Nebenwirkungen" führen, wenn man für Parameter einer Funktion und Variablen des eigentlichen Programmes die gleiche Bezeichnung wählt. Daher an dieser Stelle nochmals der Hinweis, dass man darauf nach Möglichkeit vorerst verzichten sollte. Auf eine genauere Betrachtung der "Nebenwirkungen" bzw. deren Vorteile (und auch Nachteilen) sei an dieser Stelle der Einfachheit halber verzichtet.
Genug Theorie, lass uns ein Beispiel betrachten. Wir wollen eine Funktion schreiben, die zwei Zahlen, die in den Argumenten festgelegt werden, addiert und das Ergebnis ausgibt.
def summe(summand1,summand2):""" gibt die Summe der Argumente aus """print(summand1+summand2)summe(1,1)
Teste den obigen Programmausschnitt. Probiere auch mal, die obige Funktion mit den folgenden Argumenten aufzurufen. Überlege dir vorher, welche Ausgabe oder Fehlermeldung du erwartest. Vergleiche anschließend.
summe("vier","zehn") Kannst du die Ausgabe / Fehlermeldung auch erklären?
- Schreibe eine Funktion, die drei Parameter hat und die Summe dieser ausgibt.
- Schreibe eine Funktion, die das Ergebnis der Subtraktion ihrer Parameter ausgibt.
Für die Paramter wurde die entsprechende Bezeichnung aus der Mathematik gewählt.def summe(summand1,summand2,summand3):""" gibt die Summe der Argumente aus """print(summand1+summand2+summand3)summe(1,2,3)def differenz(minuend,subtrahend):""" gibt die Differenz der Argumente aus """print(minuend-subtrahend)differenz(10,9)
Wenn wir einen Docstring festlegen und die Parameter sinnvoll bezeichnen, werden wir als "Dank" bei der Programmierung entlastet, indem uns die entsprechenden Informationen als "Hilfe" angezeigt werden.
# # Autor(en): Christian Graf# # Datum: 19.03.2011# # Beschreibung: Demo einer Funktion mit Parameterfrom turtle import TurtlemyTurtle = Turtle("turtle")def quadrat(laenge):for i in range(4):myTurtle.forward(laenge)myTurtle.left(90)quadrat(100)quadrat(200)
An dem obigen Beispiel siehst du, wie man entsprechende Funktionen in Zusammenhang mit Figuren, die Objekte der Klasse Turtle zeichnen sollen, verwenden kann. Fällt dir etwas auf, was vergessen wurde? Probiere das Beispiel ruhig aus. Ändere auch die Werte der Parameter.
Erweitere das obige Beispiel um eine Funktion names n_eck. Die Funktion soll zwei Parameter haben und eine Figur mit einer festzulegenden Anzahl an Ecken und festzulegender Seitenlänge zeichnen.
Mit dieser Funktion können wir nun ganz einfach "Kreise" zeichnen. Wir wählen einfach eine große Anzahl an Ecken, so dass die Figur aussieht wie ein Kreis.# # Autor(en): Christian Graf# # Datum: 19.03.2011# # Beschreibung: Demo einer Funktion mit Parameter - Teil 2# # Zeichnen eines n-Eckesfrom turtle import TurtlemyTurtle = Turtle("turtle")def quadrat(laenge):""" zeichnet ein Quadrat mit der gewuenschten Seitenlaenge """for i in range(4):myTurtle.forward(laenge)myTurtle.left(90)def n_eck(anzahlecken,laenge):""" zeichnet ein n-Eck mit einer festgelegten Eckenzahl und Seitenlaenge """for i in range(anzahlecken):myTurtle.forward(laenge)myTurtle.left(360/anzahlecken)n_eck(10,10)# Fenster geoeffnet lassen - fuer LinuxmyTurtle.screen._root.mainloop()