5. Parameter ⊕⊖
Ein weiteres Strukturelement eines Algorithmus sind Parameter. Die Verwendung von Parametern haben wir bereits in Aktion gesehen - im Struktogramm sind alle Parameter unterstrichen, in Python werden alle Parameter als Liste, abgetrennt mit Kommas, in den runden Klammern geschrieben.
- Parameter
- Das Ergebnis eines Algorithmus kann variiert werden durch Werte, welche bei jeder Ausführung neu festgelegt werden.
- Beispiel
- Bei einem Online-Rezept kann der Parameter Anzahl Personen mit den Knöpfen und variiert werden - die Mengenangaben werden dann aktualisiert, ohne die Reihenfolge der Einzelschritte zu verändern.
- z.B. 👉 Muffins-Rezept
Markieren Sie im Programm unten alle Parameter und Befehlsnamen wie folgt:
- Parameter unterstreichen
- Befehlsnamen gelb markieren
from turtle import *
goto(20, 30)
for i in range(5):
left(90)
forward(17)
right(90)
forward(29)
Wie können Unterprogramme geschrieben werden, die Parameter akzeptieren?
Untersuchen Sie die folgenden Unterprogramme (führen Sie diese aus!) - verstehen Sie, was passiert? Finden Sie einen Zusammenhang mit Parametern? Halten Sie Ihre Erkenntnisse fest.
rechnen.py
def quotient(zahl1, zahl2):
print(zahl1, ':', zahl2, '=', zahl1 / zahl2)
quotient(2, 3)
quotient(5, 9)
quotient(12, 20 + 4)
Zusatzfragen:
- ⭐️ Welche Parameter werden bei
quotient(12, 20 + 4)übergeben? - ⭐️ In welcher Reihenfolge werden die Parameter bei
quotient(12, 20 + 4)verrechnet?
Unterprogramme mit Parametern
Parameter sind also Werte, die an ein Unterprogramm übergeben werden können. Damit der übergebene Wert im Unterprogramm wiederverwendet werden kann, braucht jeder Parameter einen Namen. Der Wert ist dann über diesen Namen abrufbar. Der Parametername ist frei wählbar, soll aber wenn möglich die Bedeutung des übergebenen Wertes widerspiegeln.
Beispiel
from turtle import *
def quadrat(grösse):
for i in range(4):
forward(grösse)
left(90)
color('red')
quadrat(50)
color('blue')
quadrat(100)
- Unterprogramm
quadrat- Zeichnet ein Quadrat mit der übergebenen Grösse.
- Parametername
grösse- Der Parameter beschreibt, wie gross das Quadrat, welches vom Unterprogramm gezeichnet wird, sein soll.
- Es wird eine Zahl erwartet - mit Text oder anderen Werten kann das Unterprogramm nichts anfangen.
- Der Parameter beschreibt, wie gross das Quadrat, welches vom Unterprogramm gezeichnet wird, sein soll.
- Z. 9
- Es wird ein Quadrat mit der Seitenlänge
50gezeichnet (in roter Farbe, da vorhercolor('red')ausgeführt wurde). - Z. 12
- Es wird ein Quadrat mit der Seitenlänge
100gezeichnet (in blauer Farbe, da vorhercolor('blue')ausgeführt wurde).
Mehrere Parameter
Manchmal ist es praktisch (oder auch nötig), mehrere Parameter an ein Unterprogramm zu übergeben. Das sieht man etwa beim Befehl goto(x, y), bei welchem die x- und y-Koordinaten übergeben werden. Beim obigen Programm könnte etwa auch die Farbe direkt im Unterprogramm quadrat gesetzt werden:
from turtle import *
def quadrat(grösse, farbe):
color(farbe)
for i in range(4):
forward(grösse)
left(90)
quadrat(50, 'red')
quadrat(100, 'blue')
- Z. 9
- Die Parameter
50und'red'werden übergeben und im Unterprogramm auf Z. 4 und Z. 6 verwendet.- Es wird ein rotes Quadrat mit der Seitenlänge
50gezeichnet. - Es wird ein rotes Quadrat mit der Seitenlänge
- Z. 10
- Die Parameter
100und'blue'werden übergeben und im Unterprogramm auf Z. 4 und Z. 6 verwendet.- Es wird ein blaues Quadrat mit der Seitenlänge
100gezeichnet. - Es wird ein blaues Quadrat mit der Seitenlänge
Aufgaben
3. Sechseck
from turtle import *
4. Hilfsfunktion
Sequenzen, die immer wieder vorkommen, sollen als Hilfsfunktion zusammengefasst werden.
Tipp: Speichern Sie bewährte Hilfsfunktionen in Ihrem persönlichen Bereich in einem Ordner Hilfsprogramme ab.
move_to(x, y)Im untenstehenden Programm werden die Zeilen zum Bewegen der Turtle ohne dabei eine Linie zu zeichnen, immer wiederholt.
Schreiben Sie ein Unterprogramm move_to(x, y), welches diese Schritte zusammenfasst, also:
- den Stift anhebt
- zur Position (x, y) bewegt
- und den Stift absenkt
from turtle import *
def quadrat(grösse, farbe):
color(farbe)
for i in range(4):
forward(grösse)
left(90)
penup()
goto(30, 30)
pendown()
quadrat(20, 'red')
penup()
goto(-50, 30)
pendown()
quadrat(30, 'blue')
penup()
goto(0, 100)
pendown()
quadrat(40, 'green')
Häufige Fehler
Ein häufiger Fehler sind vergessene Kommas zwischen zwei Parameternamen. Dann entsteht ein SyntaxError. Die Fehlermeldung macht aber darauf aufmerksam.
from turtle import *
goto(100 200)
goto(100 200)
^^^^^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?
Ein weiterer häufiger Fehler ist die falsche Anzahl übergebener Parameter. Auch hier macht die Fehlermeldung darauf aufmerksam - wie viele Argumente (positional argument) erwartet werden und wie viele übergeben wurden.
from turtle import *
def quadrat(grösse):
for i in range(4):
forward(grösse)
left(90)
quadrat(50, 'red')
File "snippet.py", line 6, in <module>
TypeError: quadrat() takes 1 positional argument but 2 were given
Hier wird also darauf hingewiesen, dass quadrat() nur einen Parameter erwartet, aber zwei übergeben wurden.
Wird ein Parametername verwendet, der bereits als Unterprogrammname existiert, so wird das Unterprogramm überschrieben. Das führt zu Fehlern, die schwer zu finden sind.
from turtle import forward, left, color, begin_fill, end_fill
def square(grösse, color):
color(color)
begin_fill()
for i in range(4):
forward(grösse)
left(90)
end_fill()
square(50, 'red')
File "snippet.py", line 4, in square
TypeError: 'str' object is not callable
Die Fehlermeldung ist etwas kryptisch, aber sie weist darauf hin, dass versucht wurde, einen String (str), also etwa 'red', wie ein Unterprogramm aufzurufen.
Das passiert, weil auf Z. 3 der Parametername color das Unterprogramm color() aus der Bibliothek turtle (Z. 1) überschrieben hat.
Der Parametername muss geändert werden - dabei gibt es unterschiedliche Ansätze:
- Parametername in deutscher Sprache:
farbestattcolor. - Abkürzung des Parametername:
colodercolrstattcolor. - Ein Präfix verwenden:
my_coloroderp_colorstattcolor.
5. Fehler finden
Finden und beheben Sie die Fehler im folgenden Programm.
from turtle import *
def move_to(x, y):
penup()
goto(x, y)
pendown()
def bucket(forward):
right(90)
for i in range(3):
forward(forward)
left(90)
right(180)
def cross(size, color):
color(color)
begin_fill()
for i in range(4):
bucket(size)
left(90)
end_fill()
cross(50, 'red')
move_to(80, 120)
cross(40, 'blue', 'green')
move_to(-40 110)
cross(30, 'green')
Zufall
Zufallszahlen sind für die Informatik sehr wichtig - etwa für die Simulation von realen Situationen, bei Computerspielen oder aber auch für die Kryptologie (beim verschlüsseln von Daten).
Aber auch beim Erzeugen von künstlerischen Werken sind Zufallszahlen sehr nützlich, da dadurch unvorhersehbare und interessante Muster entstehen können.
In Python gibt es die Bibliothek random, welche verschiedene Befehle zum Arbeiten mit Zufallszahlen bereitstellt.
randint(min, max)
Der Befehl randint(min, max) gibt eine zufällige ganze Zahl im Bereich von min bis max zurück, wobei die Grenzwerte auch erreicht werden können.
from random import randint
print('Zufallszahl zwischen 1 und 10:', randint(1, 10))
print('Zufallszahl zwischen 1 und 99:', randint(1, 99))
6. Orakel
@Schreiben Sie ein Liebes-Orakel, welches dieselbe Frage wie die Blume beantwortet.
Beim Ausführen soll das Programm einen Text ausgeben:
Liebt mich (1) oder liebt mich nicht (0)? 0Liebt mich (1) oder liebt mich nicht (0)? 1
7. Sterne
from turtle import *
from random import randint
8. Sternenhimmel
from turtle import *
from random import randint
⭐️ Zusatz: Zufällige Sternfarben
- Fügen Sie der Funktion
star(size)einen weiteren Parameterfarbehinzu. - Übergeben Sie beim Aufruf von
stareine zufällige Farbe aus der Liste['yellow', 'white', 'lightgrey', 'lightyellow']. Um eine zufällige Farbe auszuwählen, kann die Funktionchoiceaus der Bibliothekrandomverwendet werden. Hier ein Beispiel, welches Sie für die Farbauswahl anpassen können:
from random import choice
print('Zufälliger Schultag:', choice(['Mo', 'Di', 'Mi', 'Do', 'Fr']))
9. Zufällige Kunst
- Material
- Stift
- eine ausgedruckt 👉 Vorlage
from turtle import *
from random import randint
⭐️ Zusatz
Einige Ideen für Erweiterungen:
- Fügen Sie einen Parameter
jitterzur Funktioncirca_tohinzu, mit welchem die maximale Abweichung kontrolliert werden kann. Fürjitter=2soll die Figur nur leicht, fürjitter=50stärker verzerrt werden. - Fügen Sie einen Parameter
scalezur Funktioncirca_tohinzu, mit welcher die Grösse der Figur kontrolliert werden kann. Fürscale=0.5soll die Figur halb so gross, fürscale=2doppelt so gross gezeichnet werden. - Können Sie die Figur an einer beliebigen Position zeichnen?
⭐ Challenges
Schleifenvariable
Mit for i in range(n): wird eine wiederholte Ausführung vorbereitet. Der nachfolgende Codeblock wird n Mal wiederholt.
from turtle import *
for i in range(4):
forward(50)
left(90)
Wozu steht eigentlich das i im for i in range(4)? Das ist fast wie ein Parameter: i enthält die Anzahl bereits ausgeführter Wiederholungen.
i=0, keine Wiederholung ist abgeschlossen.
i=1, eine Wiederholung ist bereits abgeschlossen.
i=2, zwei Wiederholungen sind bereits abgeschlossen.
i=3, drei Wiederholungen sind bereits abgeschlossen.
Der Wert, welcher in i steht, kann auch verwendet werden:
from turtle import *
def quadrat(size):
for i in range(4):
forward(size)
left(90)
for i in range(10):
quadrat(i * 10 + 10)
⭐️ Zusatzparameter von range()
range()range(start, ende, schritt)
Der Befehl range kann mit bis zu drei Parametern arbeiten, wobei start der erste verwendete Wert, ende das obere ganzzahlige Limit angibt (welches aber selber nie erreicht wird!) und schritt den Abstand zwischen zwei Zahlen angibt.
for i in range(2, 11, 3):
print(i)
Im obigen Beispiel startet i bei 2 und wird solange um 3 erhöht, bis die Zahl 11 erreicht oder überschiesst.
! 11 wird nicht angenommen.
Zeichnen Sie folgende Quadrate. Auf wie viele Zeilen können Sie Ihr Programm kürzen?
from turtle import *
from turtle import *
from random import randint