Wir wollen jetzt mit der Turtle das folgende Bild erzeugen: In dem Bild erkennt man vier identische Quadrate (Seitenlänge 10 Einheiten), die nebeneinander mit einem Zwischenraum von ebenfalls 10 Einheiten liegen. Hätten wir jetzt eine Funktion quadrat (), die ein Quadrat mit der Seitenlänge 10 erzeugt, so könnten wir diese Funktion vier-mal nutzen: quadrat() Ein erster Versuch: def quadrat(): Leider sieht man nur ein Quadrat! Wieso?
Die Funktion zeicnet tatsächlich ein Quadrat der gewünschten Größe. Doch nach dem Zeichenvorgang befindet sich die Turtle erneut am Startpunkt, so dass alle 4 Quadrate an derselben Position stehen. Wie kann das Problem gelöst werden? Hier sind zwei mögliche Lösungsvorschläge. Implementiere beide Möglichkeiten! Und vielleicht hast du noch weitere Ideen zur Lösung. Beachte jeweils auch, dass nur die Quadrate, nicht die Bewegungen der Turtle in den Zwischenräumen sichtbar sind.
zu a) import turtle zu b) import turtle
quadrat()
quadrat()
quadrat()
for i in range(4):
turtle.forward(10)
turtle.left(90)
quadrat()
quadrat()
quadrat()
quadrat()
Aufgabe
def quadrat():
turtle.pd()
for _ in range(4):
turtle.forward(10)
turtle.left(90)
turtle.pu()
turtle.forward(20)
turtle.ht()
for _ in range(4):
quadrat()
def quadrat():
for _ in range(4):
turtle.forward(10)
turtle.left(90)
def zumNaechstenStart():
turtle.pu()
turtle.forward(20)
turtle.pd()
turtle.ht()
for _ in range(4):
quadrat()
zumNaechstenStart()
Quadrate haben natürlich nicht immer eine Seitenlänge von 10 Einheiten, wie in dem obigen Beispiel. Die Funktion, die in der Lage ist, ein Quadrat zu erzeugen, sollte also flexibel sein, indem man die Seitenlänge (in Pixeln) angeben kann. Solch eine flexible Funktion kennen wir ja bereitsaus einem anderen Zusammenhang. Die Funktion randint () lieferte nicht immer eine Würfelzahl zwischen 1 und 6. Der Bereich für die Zufallszahl konnte mit Angaben in der Klammer bestimmt werden: Solche zusätzlichen Angaben, sog. Parameter, beeinflussen also das Verhalten der Funktion. Ein Quadrat mit einer Seitenlänge von 20 Einheiten wollen wir also erzeugen mit dem Aufruf quadrat(20), ein Quadrat mit Seitenlänge 42 jedoch mittels quadrat(42). Der zugehörige Python-Code, der diese Funktion erzeugt: import turtle In einer Funktionsdefinition einer Funktion mit Parameter wird ein Platzhalter für den Parameter angegeben, der im Rumpf der Definition benutzt werden kann. Dieser Platzhalter heisst formaler Parameter. Beim Aufruf der Funktion wird ein aktueller Parameter angegeben. In der obigen Funktion ist also seitenlaenge im Kopf der Funktionsdefinition der formale Parameter dieser Funktion. Innerhalb der Definition, also im Rumpf der Funktionsdefinition, benutzt man diesen formalen Parameter so, als ob es eine bekannte Variable ist. Ruft man in einem Programm diese Funktion auf, muss man den formalen Parameter durch die Angabe eines konkreten Wertes oder einer bereits mit einem Wert belegten Variablen ersetzen. Im Beispiel könnte das also erfolgen durch quadrat(42) oder auch breite = 42
Funktionen können auch mehr als einen Parameter haben, wie an der Zufallsfunktion zu erkennen ist. Ein eigenes Beispiel demontriert es. Ein Quadrat und ein gleichseitige Dreieck sind Beispiele eines sog. regelmäßigen n-Ecks. Alle Kanten sind gleich lang und alle Innenwinkel gleich groß. Hier sieht man ein regelmäßiges 7-Eck und ein regelmäßiges 10-Eck: Die Python-Funktion für solch ein regelmäßiges n-Eck ist eine Funktion mit zwei Parametern. Der erste Parameter gibt an, wie viele Kanten (oder auch Ecken) die Figur besitzt, und der zweite Parameter ist verantwortlich für die Kantenlänge: def regelmaessigesN_Eck(anzahlEcken, laenge):
Probiere doch einmal aus, ob du ein regelmäßiges 200-Eck erstellen kannst. Was stellst du fest? Ein regelmäßiges n-Eck mit sehr vielen Ecken ist fast ein Kreis. Dann darf man natürlich die Kantenlänge nicht zu groß wählen, da die Figur dann ebenfalls sehr groß wird. Erstellt man z.B. ein regelmäßiges 200-Eck mit einer Kantenlänge von 100 Einheiten, wird der Umfang der Figur 20000 Einheiten betragen. Diese Figur wird dann sicherlich nicht mehr auf deinem Monitor sichtbar sein! Wenn wir jetzt (mathematisch sicherlich nicht korrekt) ein 200-Eck als Kreis betrachten, stellt sich die Frage, wie man die Kantenlänge dieses 200-Ecks wählen muss, wenn man den Radius vorgibt. Dazu die folgenden Überlegungen: Will man also einen Kreis (also ein 200-Eck) mit Radius `r` erstellen, muss man ersatzweise ein 200-Eck mit Kantenlänge `(π r) / 100` zeichnen.
Probiere einmal aus, ob du Unterschiede feststellen kannst. Der zugehörige Code: import turtle def regelmaessigesN_Eck(anzahlEcken, laenge):
def quadrat(seitenlaenge):
for _ in range (4):
turtle.forward(seitenlaenge)
turtle.left(90)
quadrat(breite)
Aufgabe
winkel = 360 / anzahlEcken
for _ in range(anzahlEcken):
turtle.forward (laenge)
turtle.left (winkel)
import math
winkel = 360 / anzahlEcken
for _ in range(anzahlEcken):
turtle.forward (laenge)
turtle.left (winkel)
def kreis(radius):
kantenlaenge = (math.pi * radius) / 100
regelmaessigesN_Eck(200, kantenlaenge)
Bisher waren die Funktionen so gestaltet, dass sie eine Aktion auslösten, die auf dem Monitor sichtbar wurde.
Jedoch kommt es sehr oft vor, dass eine Funktion einen Wert berechnet oder erzeugt, der nicht sofort auf dem Monitor angezeigt werden soll, sondern von anderen Programmteilen weiterverarbeitet werden soll. Das soll an einigen Beispielen erläutert werden.
Betreiben wir ein wenig Geometrie! Dort haben wir z.B. erfahren, wie man den Flächeninhalt von Rechtecken berechnen kann. Das könnte man mit der folgenden Funktion erledigen: def flaeche(a,b): Das ist zwar korrekt, doch soll die Funktion den Wert eigentlich nicht anzeigen. Denn Wir werden also die Funktion ändern, so dass keine Ausgabe erscheint, sondern dser berechnete Wert zurückgegeben (ausgeliefert) wird: def flaeche(a,b): Jetzt kann man die Ausgabe nach eigenen Wünschen gestalten: breite = int(input("Breite des Rechtecks:")) print ("Das Rechteck mit den Maßen", return ist in Python ein reserviertes Schlüsselwort. Innerhalb einer Funktionsdefinition bewirkt es, dass an dieser Stelle die Abarbeitung der Funktion sofort beendet wird und der Wert des Ausdrucks, der hinter diesem Schlüsselwort steht, als Rückgabewert benutzt wird. Diesen Rückgabewert kann das aufrufende Programm dann benutzen. vorhergehender Absatz -1 Ds nebenstehende Bild soll erzeugt und der zugehörige Flächeninhalt angezeigt werden. Dazu wird das folgende Programm geschrieben: breite = 100 quadrat(breite) turtle.pu() kreis(radius) print ("Die Figur hat einen Flächeninhalt von", Vervollständige das Programm, indem du die fehlenden Funktionen definierst.
area = a * b
print (area)
area = a * b
return area
hoehe = int(input("Höehe des Rechtecks:"))
breite, "cm und", hoehe,
"cm hat einen Flächeninhalt von",
flaeche(breite,hoehe), "Qudratcentimeter")
Aufgabe
radius = breite/2
turtle.left(90)
turtle.forward(breite)
turtle.right(90)
turtle.forward(radius)
turtle.pd()
flaecheQuadrat(breite) + flaecheKreis(radius), "Qudratcentimeter")