Funktionen mit Rückgabewert
Bisher haben deine Funktionen etwas getan: gezeichnet, ausgegeben, die Turtle bewegt.
Es gibt aber auch Funktionen, die etwas zurückliefern – ein Ergebnis, mit dem du weiterarbeiten kannst.
Funktionen der Turtle, die etwas zurückgeben
| Funktion | liefert zurück |
|---|---|
xcor() |
die aktuelle x-Koordinate der Turtle |
ycor() |
die aktuelle y-Koordinate der Turtle |
heading() |
die aktuelle Blickrichtung in Grad |
position() |
beide Koordinaten als Paar |
towards(x, y) |
den Winkel von der Turtle zum Punkt (x | y) |
Diese Werte kannst du in Variablen speichern, ausgeben oder in Bedingungen verwenden.
Aufgabe 1: Die Position abfragen
a) Analysiere das folgende Beispiel und erläutere die Neuerungen.
b) Erweitere es schrittweise so, dass die Punkte in der oberen und in der unteren Bildschirmhälfte unterschiedliche Größen bekommen. Verwende dazu ycor().
Tipp: Was ist hier neu?
Neu ist, dass die Bedingung nicht mehr von der Zählvariablen abhängt, sondern von der tatsächlichen Position der Turtle.
Das ist ein wichtiger Unterschied: Das Programm funktioniert auch dann noch richtig, wenn du den Startpunkt oder die Schrittweite änderst. Probiere es aus!
Aufgabe 2: Zufällige Sprünge
Für die nächsten Aufgaben brauchst du Zufallszahlen:
from random import randint
zahl = randint(1, 100) # eine zufällige ganze Zahl von 1 bis 100
- Die Zeile
from random import randintgehört an den Anfang des Programms – so wiefrom turtle import *. randint(a, b)liefert eine zufällige ganze Zahl zwischenaundb. Beide Grenzen sind eingeschlossen.
Die Turtle soll 100 mal an eine zufällige Position springen. Befindet sie sich in der linken Hälfte des Fensters, soll sie einen roten Punkt zeichnen, sonst einen blauen.
Entwickle ein geeignetes Programm.
Tipp 1: Wie springt die Turtle zufällig?
Erzeuge zwei Zufallszahlen und gehe damit zu einem Punkt:
goto(randint(-290, 290), randint(-210, 210))
Die Grenzen ergeben sich aus der Größe der Zeichenfläche: Bei screensize(600, 440) reicht sie von -300 bis 300 und von -220 bis 220.
Tipp 2: Welche Hälfte?
Da der Ursprung in der Mitte liegt, gilt: Alles mit xcor() < 0 liegt in der linken Hälfte.
from turtle import *
from random import randint
shape("turtle")
screensize(600, 440)
speed(0)
penup()
for i in range(100):
goto(randint(-290, 290), randint(-210, 210))
if xcor() < 0:
pencolor("red")
else:
pencolor("blue")
dot(20)
Aufgabe 3: Den Rand schmücken
Die Turtle soll den Rand des Fensters mit Punkten schmücken, wie unten zu sehen.
Entwickle ein geeignetes Programm. Nutze dabei xcor() und ycor() in den Schleifenbedingungen.
Tipp 1: Vier Seiten, vier Schleifen
Für jede Seite des Rahmens brauchst du eine eigene while-Schleife. Die untere Kante zum Beispiel:
while xcor() < 280:
dot(20)
forward(20)
Danach dreht sich die Turtle mit left(90) und die nächste Schleife beginnt.
Tipp 2: Achte auf die Vergleichsrichtung
Läuft die Turtle nach rechts, wird xcor() größer – die Bedingung lautet < 280.
Läuft sie nach links, wird xcor() kleiner – dann brauchst du > -280.
from turtle import *
shape("turtle")
screensize(600, 440)
speed(0)
penup()
goto(-280, -200)
while xcor() < 280:
dot(20)
forward(20)
left(90)
while ycor() < 200:
dot(20)
forward(20)
left(90)
while xcor() > -280:
dot(20)
forward(20)
left(90)
while ycor() > -200:
dot(20)
forward(20)
Eigene Funktionen mit Rückgabewert
Jetzt schreiben wir selbst eine Funktion, die ein Ergebnis zurückgibt.
Analysiere das folgende Beispiel. Notiere Fragen, wenn etwas unklar bleibt.
return wertbeendet die Funktion sofort und gibtwertzurück.- Der Aufruf
fakultaet(5)steht dann für das Ergebnis – du kannst ihn speichern, ausgeben oder weiterverwenden. - Eine Funktion ohne
returngibt automatischNonezurück („nichts"). - Verwechsle nicht
returnundprint:printzeigt etwas an,returngibt etwas weiter. Nur mitreturnkann man mit dem Ergebnis weiterrechnen.
Aufgabe 4: Die Summe
Entwickle eine Funktion summe(zahl), die die Summe der natürlichen Zahlen von 1 bis zahl berechnet und als Rückgabewert zurückgibt.
Zur Kontrolle: summe(10) soll das Ergebnis 55 liefern.
Tipp: Klicke auf den Testen-Knopf, um deine Lösung automatisch überprüfen zu lassen.
Tipp 1: Der Aufbau
Die Funktion fakultaet ist fast dieselbe Aufgabe – nur wird dort multipliziert statt addiert.
Überlege außerdem: Womit muss das Ergebnis am Anfang belegt sein, wenn addiert wird? Bei der Multiplikation war es die 1.
Tipp 2: Mit einer for-Schleife
Statt einer while-Schleife geht es auch kürzer. Beachte, dass range(1, zahl + 1) die Zahlen von 1 bis zahl liefert:
for i in range(1, zahl + 1):
ergebnis = ergebnis + i
def summe(zahl):
ergebnis = 0
for i in range(1, zahl + 1):
ergebnis = ergebnis + i
return ergebnis
Aufgabe 5: Gerade oder ungerade?
Entwickle eine Funktion ist_gerade(zahl), die True zurückgibt, falls zahl gerade ist, und andernfalls False.
Lass deine Lösung wieder automatisch testen.
Tipp 1: Woran erkennt man gerade Zahlen?
Das kennst du schon aus der Lektion über Verzweigungen: Eine Zahl ist gerade, wenn der Rest bei der Division durch 2 gleich 0 ist.
Tipp 2: Es geht auch ohne if
Ein Vergleich liefert selbst schon True oder False. Du kannst ihn also direkt zurückgeben:
return zahl % 2 == 0
def ist_gerade(zahl):
return zahl % 2 == 0
Ausführlicher, aber gleichwertig:
def ist_gerade(zahl):
if zahl % 2 == 0:
return True
else:
return False
Zusatzaufgabe
Entwickle analog zu Aufgabe 2 weitere Muster, die durch zufällige Sprünge langsam entstehen.
Zum Beispiel:
- ein gefülltes Rechteck in der Mitte des Bildschirms,
- ein Kreis (das ist besonders anspruchsvoll),
- ein Muster deiner Wahl.
Tipp für den Kreis
Ein Punkt (x | y) liegt genau dann innerhalb eines Kreises um den Ursprung mit Radius r, wenn gilt:
In Python:
if xcor() ** 2 + ycor() ** 2 < 150 ** 2:
pencolor("red")
else:
pencolor("lightgray")