Zum Hauptinhalt springen
Version: 29Gj

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.

Zur Erinnerung
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
1. Parameter identifizieren und finden

Markieren Sie im Programm unten alle Parameter und Befehlsnamen wie folgt:

  • Parameter unterstreichen
  • Befehlsnamen gelb markieren
Laden...
from turtle import *

goto(20, 30)
for i in range(5):
left(90)
forward(17)
right(90)
forward(29)
Laden...

Wie können Unterprogramme geschrieben werden, die Parameter akzeptieren?

2. Unterprogramme mit Parametern

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.

hello.py

def hallo(name):
print('Hallo', name)

hallo('Maria')
hallo('Reto')
hallo('Hans')
Laden...

rechnen.py

def quotient(zahl1, zahl2):
print(zahl1, ':', zahl2, '=', zahl1 / zahl2)

quotient(2, 3)
quotient(5, 9)
quotient(12, 20 + 4)
Laden...

Zusatzfragen:

  • ⭐️ Welche Parameter werden bei quotient(12, 20 + 4) übergeben?
  • ⭐️ In welcher Reihenfolge werden die Parameter bei quotient(12, 20 + 4) verrechnet?
Laden...
Laden...

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.
Beachte
Z. 9
Es wird ein Quadrat mit der Seitenlänge 50 gezeichnet (in roter Farbe, da vorher color('red') ausgeführt wurde).
Z. 12
Es wird ein Quadrat mit der Seitenlänge 100 gezeichnet (in blauer Farbe, da vorher color('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')
Beachte
Z. 9
Die Parameter 50 und 'red' werden übergeben und im Unterprogramm auf Z. 4 und Z. 6 verwendet.
Es wird ein rotes Quadrat mit der Seitenlänge 50 gezeichnet.
Z. 10
Die Parameter 100 und 'blue' werden übergeben und im Unterprogramm auf Z. 4 und Z. 6 verwendet.
Es wird ein blaues Quadrat mit der Seitenlänge 100 gezeichnet.

Aufgaben

3. Sechseck

3. Parameternamen
from turtle import *
    Laden...

    4. Hilfsfunktion

    Hilfsfunktionen

    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.

    4. 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')
    Laden...

    Häufige Fehler

    SyntaxError: Vergessene Kommas

    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?
    TypeError: Falsche Anzahl Parameter

    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.

    Überschreibung von Unterprogrammen

    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.

    Lösung

    Der Parametername muss geändert werden - dabei gibt es unterschiedliche Ansätze:

    • Parametername in deutscher Sprache: farbe statt color.
    • Abkürzung des Parametername: col oder colr statt color.
    • Ein Präfix verwenden: my_color oder p_color statt color.

    5. Fehler finden

    5. Fehler finden und beheben
    Gewünschte Ausgabe

    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')
    Laden...

    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

    6. Liebes-Orakel
    Das Spiel "Liebt mich, liebt mich nicht" kennen wohl aus der Kindheit. Bei einer Blume werden die Blütenblätter nacheinander abgezupft, während man abwechselnd "Liebt mich" und "Liebt mich nicht" sagt. Am Ende entscheidet das letzte Blütenblatt über die Antwort.
    @

    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)? 0
    • Liebt mich (1) oder liebt mich nicht (0)? 1

    Laden...

    7. Sterne

    7. Stern zufälliger Grösse
    from turtle import *
    from random import randint
      Laden...

      8. Sternenhimmel

      8. Sternenhimmel
      Zielsetzung: Ein Sternenhimmel mit vielen Sternen an zufälligen Positionen.
      from turtle import *
      from random import randint

        ⭐️ Zusatz: Zufällige Sternfarben

        1. Fügen Sie der Funktion star(size) einen weiteren Parameter farbe hinzu.
        2. Übergeben Sie beim Aufruf von star eine zufällige Farbe aus der Liste ['yellow', 'white', 'lightgrey', 'lightyellow']. Um eine zufällige Farbe auszuwählen, kann die Funktion choice aus der Bibliothek random verwendet 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']))
        Laden...

        9. Zufällige Kunst

        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 jitter zur Funktion circa_to hinzu, mit welchem die maximale Abweichung kontrolliert werden kann. Für jitter=2 soll die Figur nur leicht, für jitter=50 stärker verzerrt werden.
          • Fügen Sie einen Parameter scale zur Funktion circa_to hinzu, mit welcher die Grösse der Figur kontrolliert werden kann. Für scale=0.5 soll die Figur halb so gross, für scale=2 doppelt so gross gezeichnet werden.
          • Können Sie die Figur an einer beliebigen Position zeichnen?

          ⭐ Challenges

          Schleifenvariable

          Wiederholung: 🔁 Wiederholte Ausführung

          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.

          Während Wiederholung 1: i=0, keine Wiederholung ist abgeschlossen.
          Während Wiederholung 2: i=1, eine Wiederholung ist bereits abgeschlossen.
          Während Wiederholung 3: i=2, zwei Wiederholungen sind bereits abgeschlossen.
          Während Wiederholung 4: 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(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.

          ⭐️ Quadrate

          Zeichnen Sie folgende Quadrate. Auf wie viele Zeilen können Sie Ihr Programm kürzen?

          from turtle import *
          Laden...
          ⭐️ Punkte
          Zielsetzung: Ein Punktegitter mit unterschiedlich starken Abweichungen.
            from turtle import *
            from random import randint