Ein Unterprogramm stellt einen wiederverwendbaren Code-Block dar. Dieses kann durch übergebene Argumente mit verschiedenen Situationen umgehen. Zudem kann es einen Wert berechnen und diesen als Rückgabewert zurückliefern.
Rückgabewerte weiterverwenden
Gewisse Unterprogramme berechnen etwas und liefern den Wert zurück. Bei den Turtle-Unterprogrammen gibt es auch solche. Mit ihnen lässt sich der momentane Zustand der Turtle abfragen.
turtle.shape("classic")- setze die Form der Turtle auf ein Dreieck. Liefert keinen Wert zurück.
turtle.shape()- fragt die Turtle welche Form aktiv ist und liefert diese als Rückgabewert zurück.
import turtle
turtle.shape('turtle') # setzt den Turtle-Typ auf "turtle"
print(turtle.shape()) # gibt in der Shell "turtle" aus
turtle.shape('classic') # setzt den Turtle-Typ auf "classic"
print(turtle.shape()) # gibt in der Shell "classic" aus
turtle.done()Weitere Turtle-Unterprogramme mit Rückgabewert sind position() (liefert Koordinaten als Vec2D) oder heading() (liefert den momentanen Winkel der Turtle als Zahl).
import turtle
turtle.left(42)
turtle.forward(123)
h = turtle.heading()
c = turtle.position()
print("richtung:", h, "koordinaten:", c)
turtle.done()Rückgabewert zurückliefern
Unsere selbst definierten Unterprogramme haben die Turtle herumfahren lassen. Häufig werden Unterprogramme aber verwendet, um etwas zu Berechnen. Der berechnete Wert wird dann zurückgeliefert und kann vom aufrufenden Programm weiterverwendet werden.
Wir könnten z.B. berechnen, wie weit die Turtle von ihrem Ausgangspunkt entfernt ist. Da die Turtle beim Punkt (0,0) startet, können wir die Berechnung einfach mit Pythagoras machen. Mit den aktuellen Koordinaten der Turtle
Diesen berechneten Wert soll dann weiterverwendet werden können:
distanz mit RückgabewertDas Unterprogramm zur Berechnung der Quadratwurzel finden wir im math-Modul.
import turtle, math
def distanz():
x,y = turtle.pos()
d = math.sqrt(x*x + y*y)
return d
turtle.left(30)
turtle.forward(100)
turtle.left(160)
turtle.forward(50)
strecke = distanz() # Funktion aufrufen und Wert merken
print(strecke) # Wert ausgeben
turtle.left(39) # etwa in Richtung Start ausrichten
turtle.forward(strecke) # zum Start zurückfahren
turtle.done()Aufgaben
Bei der Turtle braucht man eher selten Rückgabewerte – wir erhalten meistens genügend Rückmeldung durch die Turtle und dem was sie zeichnet. Unterprogramme braucht man häufig, wenn man etwas berechnen möchte:
Aufgabe: Umfang gleichseitiges Dreieck
Gegeben sei ein Unterprogramm, welches ein gleichseitiges Dreieck zeichnet. Die Seitenlänge wird als Argument übergeben:
import turtle
def dreieck_gleichseitig(s):
turtle.forward(s)
turtle.left(120)
turtle.forward(s)
turtle.left(120)
turtle.forward(s)
turtle.left(120)
dreieck_gleichseitig(100)
turtle.backward(200)
dreieck_gleichseitig(144)
turtle.done()- Schreibe ein zweites Unterprogramm
umfang(s), welches ebenfalls als Argument die Seitenlänge eines gleichseitigen Dreickes erhält und daraus den Umfange berechnet und zurückgibt. - Rufe dieses Unterprogramm im Unterprogramm
dreieck_gleichseitig()auf und schreibe mitturtle.write()den Umfang in eine Ecke des Dreiecks.
mehr: Tipp
import turtle
def umfang(s):
umfang = ...
return umfang
def dreieck_gleichseitig(s):
...
u = umfang(s)
turtle.write(u)
...
return ...
dreieck_gleichseitig(100)
turtle.backward(200)
dreieck_gleichseitig(144)
turtle.done()Lösung
import turtle
def umfang(s):
umfang = 3*s
return umfang
def dreieck_gleichseitig(s):
turtle.forward(s)
turtle.left(120)
u = umfang(s)
turtle.write(u)
turtle.forward(s)
turtle.left(120)
turtle.forward(s)
turtle.left(120)
dreieck_gleichseitig(100)
turtle.backward(200)
dreieck_gleichseitig(144)
turtle.done()Aufgabe: Fläche gleichseitiges Dreieck
Schreibe ein Unterprogramm, das die Fläche eines gleichseitigen Dreiecks gegeben durch die Seitenlänge berechnet. Das Unterprogramm soll nichts zeichnen, sondern nur die Berechnung anstellen und das Ergebnis als Rückgabewert zurückliefern. Es kann dann im vorherigen Beispiel eingebaut werden, so dass neben dem Umfang auch die Fläche des Dreiecks, z.B. in der nächsten Ecke, angezeigt wird.
mehr: Tipp
Du kennst ja nur die Seitenlänge des Dreiecks. Zur Berechnung der Fläche brauchst du die Höhe. Diese kannst du mit Pythagoras berechnen, da die Höhe ja das gleichseitige Dreieck in zwei rechtwinklige Dreiecke unterteilt.
Lösung
import turtle, math
def umfang(s):
umfang = 3*s
return umfang
def flaeche(s):
h = math.sqrt(s**2 + (s/2)**2)
a = s * h /2
return a
def dreieck_gleichseitig(s):
turtle.forward(s)
turtle.left(120)
u = umfang(s)
turtle.write(u)
turtle.forward(s)
turtle.left(120)
f = flaeche(s)
turtle.write(f)
turtle.forward(s)
turtle.left(120)
dreieck_gleichseitig(100)
turtle.backward(200)
dreieck_gleichseitig(144)
turtle.done()Zusatzaufgabe: Formatierung
Wie könntest du die Fläche etwas schöner ausgeben, z.B. keine oder nur wenige Nachkommastellen.
mehr: Tipp
https://www.w3schools.com/python/ref_func_round.asp
https://www.w3schools.com/python/python_string_formatting.asp
Lösung: Formatierung
Man kann mit dem round-Unterprogramm auf eine bestimmte Anzahl Nachkommstellen (zweites Argument) runden.
Hier wird auch zwei Nachkommastellen gerundet:
x = 12.33434
y = round(x,2)
print(x,y)Mehr unter https://www.w3schools.com/python/ref_func_round.asp
Eine Alternative sind sogenannt F-Strings. Dort können direkt Variablen eingebaut und formatiert werden. In folgendem Beispiel wird {price:.2f} mit der Variablen price ersetzt, formatiert als float mit 2 Kommastellen.
price = 59
txt = f"The price is {price:.2f} dollars"
print(txt)Mehr unter https://www.w3schools.com/python/python_string_formatting.asp