Funktionen
Mit einer Funktion können wir eine Gruppe von Instruktionen bündeln und benennen:
from turtle import *
def quadrat():
for i in range(4):
forward(100)
left(90)
quadrat()
print('Fertig.')
Im obigen Programm wird auf den Zeilen 3-6 die Funktion quadrat() definiert. Sobald diese Zeilen ausgeführt worden sind, ist dieser neue Befehl quadrat() bekannt und kann verwendet werden. Zu diesem Zeitpunkt wurde aber noch keine Turtle-Zeichnung erstellt. Wir haben uns so aber quasi einen eigenen neuen Turtle-Befehl erstellt.
Auf Zeile 8 wird die quadrat()-Funktion verwendet. Python springt damit wieder nach oben auf die 3 und führt die Befehle auf den Zeilen 4-6 aus. Sobald die Funktion fertig ausgeführt wurde, geht die Ausführung mit Zeile 9 weiter.
Mit Funktionen können Sie natürlich nicht nur «neue Turtle-Befehle» erstellen, sonder beliebige Gruppen von Instruktionen bündeln und benennen.
Folgende Punkte sind im Zusammenhang mit Funktionen zu beachten:
- Die Definition einer Funktion beginnt immer mit
defund endet mit Klammern und einem Doppelpunkt - Die Einrückung funktioniert gleich wie der
for- undwhile-Schleife, respektive denif-Verzweigungen. - Ein Funktionsaufruf beginnt nicht mit einem
def, und endet mit Klammern, aber ohne Doppelpunkt. - Eine Funktion kann erst aufgerufen werden, wenn sie definiert ist. Die Definition muss also weiter oben stehen, als der erste Aufruf.
- Eine Funktion kann beliebig oft aufgerufen werden.
Die Vorteile von Funktionen sind:
- Wiederverwendbarkeit
- Einmal definierte Funktionen können beliebig oft aufgerufen werden, ohne dass der Code mehrfach geschrieben werden muss. Bei einer Schleife werden Instruktionen auch mehrfach ausgeführt, aber alle Wiederholungen passieren direkt nacheinander. Mit Funktionen können wir Code auch an verschiedenen Stellen im Programm (also zu verschiedenen Zeitpunkten in der Ausführung) wiederverwenden.
- Strukturierung
- Funktionen helfen dabei, den Code zu strukturieren und in überschaubare und vor allem «beschriftete» Einheiten zu gliedern. Dadurch wird der Code lesbarer und verständlicher. Das ist insbesondere innerhalb von komplexen Verzweigungen hilfreich.
- Abstraktion
- Funktionen ermöglichen es, komplexe Abläufe zu abstrahieren. Denken Sie an die Turtle-Befehle (die auch nur Funktionen sind): Wenn Sie
forward(100)aufrufen, müssen Sie nicht wissen, wie genau die Turtle intern vorwärts bewegt wird. Sie müssen nur wissen, was der Befehl bewirkt. - Allgemeinheit
- Funktionen können sogenannte Parameter entgegennehmen, die es ermöglichen, den Funktionsaufruf mit unterschiedlichen Werten zu variieren. Dadurch kann ein Code-Block «allgemein» definiert und später mit verschiedenen Eingaben verwendet werden. Mehr dazu im nächsten Abschnitt.
Definieren Sie eine Funktion zeichne_dreieck(), die ein gleichseitiges Dreieck mit der Seitenlänge 100 zeichnet. Rufen Sie die Funktion anschliessend einmal auf, damit das Dreieck auch tatsächlich gezeichnet wird.
Ihr Programm soll wie folgt funktionieren:
- Es wird zuerst eine Zufallszahl zwischen
1und6gewürfelt. - Wenn die Zahl grösser als
3ist, soll ein Quadrat mit der Seitenlänge50gezeichnet werden. - Wenn die Zahl kleiner oder gleich
3ist, soll ein Dreieck mit der Seitenlänge100gezeichnet werden.
In Ihrem Code sollen Sie innerhalb der Verzweigung (if / else) allerdings keine Turtle-Befehle (forward(), left(), etc.) verwenden. Definieren Sie stattdessen zwei Funktionen: zeichne_quadrat() und zeichne_dreieck() (aus der vorherigen Aufgabe), die jeweils die entsprechenden Formen zeichnen. Rufen Sie dann innerhalb der Verzweigung die entsprechenden Funktionen auf.
Probieren Sie Ihr Programm ein paar Mal aus, damit Sie sicherstellen können, dass sowohl das Quadrat als auch das Dreieck gezeichnet werden können.
Parameter und Argumente
Bei der Definition einer Funktion möchten wir oft erlauben, dass die Funktion beim Aufruf bestimmte Werte entgegennimmt, mit denen sie dann arbeitet. Beispielsweise könnten wir in einem Turtle-Programm eine Funktion definieren, die ein Quadrat zeichnet. Dabei möchten wir vielleicht erlauben, dass die Seitenlänge des Quadrats beim Aufruf der Funktion angegeben werden kann.
Wir unterscheiden konzeptuell zwischen Parametern und Argumenten:
- Parameter
- Ein Parameter ist ein Variablenname, über den eine Funktion gemäss ihrer Definition einen Wert entgegennimmt.
- Im unten stehenden Beispielprogramm definiert die Funktion
sag_hallo()auf Zeile1einen Parameter namensname.- Sie nimmt beim Aufruf also einen Wert entgegen, den sie (automatisch) der Variable
namezuweist. - Im unten stehenden Beispielprogramm definiert die Funktion
- Argument
- Ein Argument ist ein konkreter Wert, den wir einer Funktion beim Aufruf für einen bestimmten Parameter mitgeben.
- Im unten stehenden Beispielprogramm wird die
sag_hallo()-Funktion auf Zeile4mit dem Argument'Bob'für den Parameternameaufgerufen.- Auf Zeile
5wird sie erneut aufgerufen — diesmal jedoch mit dem Argument'Alice'für den Parametername. - Im unten stehenden Beispielprogramm wird die
from turtle import *
def zeichne_quadrat(seitenlaenge):
for _ in range(4):
forward(seitenlaenge)
right(90)
zeichne_quadrat(100) # Quadrat mit Seitenlänge 100
zeichne_quadrat(150) # Quadrat mit Seitenlänge 150
Hier definiert die Funktion zeichne_quadrat() auf Zeile 3 einen Parameter namens seitenlaenge. Beim Aufruf der Funktion auf Zeile 8 und Zeile 9 werden die Argumente 100 bzw. 150 für diesen Parameter übergeben. Verwendet wird der Parameter innerhalb der Funktion auf Zeile 5 und verhält sich wie eine Variable, die den übergebenen Wert enthält.
Eine Funktion kann auch mehrere Parameter haben, die dann durch Kommas getrennt werden:
from turtle import *
def zeichne_quadrat(seitenlaenge, farbe):
pencolor(farbe)
for _ in range(4):
forward(seitenlaenge)
right(90)
zeichne_quadrat(100, 'red') # Quadrat mit Seitenlänge 100 und Farbe rot
zeichne_quadrat(150, 'blue') # Quadrat mit Seitenlänge 150 und Farbe blau
Diese Version der Funktion zeichne_quadrat() hat zwei Parameter: seitenlaenge und farbe. Beim Aufruf der Funktion auf Zeile 9 und Zeile 10 werden die jeweils zwei entsprechenden Argumente für diese Parameter übergeben. Verwendet werden die Parameter innerhalb der Funktion auf den Zeilen 4 (farbe) und 6 (seitenlaenge). Auch sie verhalten sich wie zwei Variablen, die die übergebenen Werte enthalten.
Löschen Sie den Kommentar auf Zeile 3 und definieren Sie dort eine Funktion zeichne_rechteck(...), die zwei Parameter entgegennimmt: breite und hoehe. Die Funktion soll ein Rechteck mit der angegebenen Breite und Höhe zeichnen.
from turtle import *
# Definieren Sie hier Ihre Funktion...
zeichne_rechteck(200, 100) # Rechteck mit Breite 200 und Höhe 100