Funktionen
Besprechung der Hausaufgaben
Lernziele heute
- Funktionen oder: Wie man grössere Programm übersichtlich gestaltet: modularer Entwurf, Baukastenprinzip.
Aufgabe 1
Gemeinsam an Tafel
Wenn man ein Haus baut, welche Arbeiten müssen durchgeführt werden? Reihenfolge egal, denkt an die beteiligten Handwerker.
Allgemeines zu Funktionen
Das Aufteilen einer grösseren Vorhabens in Teilvorhaben, die sogenannten Module, nennt man Modularisierung, auch modularen Entwurf oder Baukastenprinzip.
In der Informatik wird dies oft durch Funktionen bewerkstelligt. “Funktionen sind die Spezialisten beim Programmieren.”
Wir haben schon viele Funktionen kennengelernt und verwendet, z. B. print
, input
, forward
, right
, penUp
, makeTurtle
, setPenColor
, random
.
Funktionen werden aufgerufen (Funktionsaufruf), indem man den jeweiligen Funktionsnamen angibt und danach in runden Klammern geeignete Parameter (= Übergabewerte) angibt.
Die runden Klammern sind beim Funktionsaufreu stets hinzuschreiben, auch wenn keine Parameter übergeben werden.
Beispiele:
setPenColor(“red”)
ist ein Aufruf der FunktionsetPenColor
mit“red”
als Parameter.penUp()
ist ein Aufruf der FunktionpenUp
; diese Funktion nimmt keine Parameter entgegen.
Zum besseren Verständnis ist es sinnvoll, Funktionen in vier Arten einzuteilen, je nachdem, ob sie
- Parameter (= Übergabewerte) benötigen oder nicht;
- einen Rückgabewert zurückgeben oder nicht.
In der folgenden Tabelle ist für jeder dieser vier Arten ein Beispiel angegeben und darunter ein Aufruf der Funktion.
Funktionen | ohne Parameter | mit Parameter(n) |
---|---|---|
ohne Rückgabewert | makeTurtle | penWidth |
makeTurtle() | penWidth(10) |
|
mit Rückgabewert | random | input |
random() | input(“Wie heisst du?”) |
Grob gesagt kann man Aufrufe (und Definitionen, siehe unten) von Funktionen daran erkennen, dass nach ihnen ein Paar runder Klammern (mit oder ohne Parameter dazwischen) auftaucht!
Beachte: Sogenannte Schlüsselworte wie repeat
, if
, else
, while
etc. sind keine Funktionen. Sie werden verwendet, um den Ablauf von Python-Programmen zu steuern.
Die Zusatzinformation, die sie entgegennehmen (etwa die 13
in repeat 13:
oder die Bedingung x == 2
in if x == 2:
) wird bei gutem Programmierstil NICHT in runde Klammern eingeschlossen.
Also bitte nicht repeat(13):
oder if(x==2):
schreiben (auch wenn es keine Fehlermeldung gibt).
In den folgenden Aufgaben lernst du durch Beispiele, wie du selbst neue Funktionen definieren kannst.
Die folgende Tabelle stellt dar, welche Aufgabe sich mit welcher Art von Funktion beschäftigt und welche Funktionen darin definiert werden.
Statt sofort mit Aufgabe 2 zu beginnen, programmieren wir zusammen.
Aufgabe 2, Funktionen ohne Parameter und ohne Rückgabewert definieren
Einzelarbeit, ca. 10 Minuten
Der folgende Code definiert eine Funktion quadrat100
(die keine Parameter entgegennimmt).
Das Schlüsselwort def
für englisch define leitet die Definition einer neuen Funktion ein, danach kommt der Funktionsname mit runden Klammern (hier ohne Parameter darin) und danach ein Doppelpunkt. Der eingerückte Code-Block beschreibt genau, was die Funktion macht.
from gturtle import * # In der folgenden Zeile beginnt die Definition der Funktion def quadrat100(): repeat 4: forward(100) right(90) # Hier ist die Definition der Funktion dreieck100 zu ergänzen. # In der folgenden Zeile beginnt das Hauptprogramm makeTurtle() # Ergänze den Code.
- Öffne ein neues, leeres Programmfenster in Tigerjython und kopiere das obige Programm hinein.
- Ergänze das Programm an der angegebenen Stelle um eine Funktion
dreieck100
, die ein gleichseitiges Dreieck der Seitenlänge 100 zeichnet; dabei soll die Turtle jeweils “nach links abbiegen” und am Ende im selben Zustand wie am Anfang sein. - Ergänze das Hauptprogramm und nutze die Funktion
dreieck100
, um die Figur unten links zu zeichnen (mit möglichst wenig Code-Zeilen). - Etwas schwieriger: Ändere das Hauptprogramm und nutze die beiden Funktionen
quadrat100
unddreieck100
, um die Figur unten rechts zu zeichnen.
Aufgabe 3, Funktionen mit einem Parameter und ohne Rückgabewert definieren
Einzelarbeit, ca. 10 Minuten
Zusätzliche mündliche Erklärung durch mich:
Der folgende Code definiert eine Funktion quadrat
mit einem Parameter s
, der die Seitenlänge des Quadrats angibt. Der Parameter s
wird innerhalb der Funktionsdefinition wie eine Variable verwendet. Welchen Wert diese Variable hat, wird bei jedem Funktionsaufruf angegeben. Zeige es im Einzelschrittverfahren!
from gturtle import * # In der folgenden Zeile beginnt die Definition der Funktion def quadrat(s): repeat 4: forward(s) right(90) # In der folgenden Zeile beginnt das Hauptprogramm makeTurtle() quadrat(100) # Aufruf der Funktion mit 100 als Parameter/Übergabewert # #x = 100 #repeat 7: # quadrat(x) # Aufruf der Funktion mit dem Wert von x als Parameter # x = x + 20
(Für das Folgende kannst du entweder ein neues Programm schreiben oder das obige Programm in eine neues Programmierfenster kopieren und modifizieren.)
Schreibe nun selbst eine Funktion vieleck
, die einen Parameter n
entgegennimmt und ein regelmässiges $n$-Eck der Seitenlänge 50 zeichnet; die Turtle soll am Ende im selben Zustand wie am Anfang sein. Nutze deine Funktion, um die folgende Figur zu zeichnen (ein Dreieck in einem Viereck in einem Fünfeck … undsoweiter … in einem 13-Eck).
Aufgabe 4, Mäander (Ornamentik), mehrere Funktionen kombinieren
Einzelarbeit, ca. 20 Minuten
Ziel ist, das linke Muster effizient zu zeichnen. Gewisse Teilstrukturen wiederholen sich: Das rote Ornament im Muster rechts kommt $8+5+8+5 = 26$ Mal vor, der grüne Pfad als “verbindende Eckbewegung” 4 Mal. Deshalb ist es sinnvoll, diese Teilstrukturen von Funktionen zeichnen zu lassen.
Schreibe wie folgt ein Programm dafür:
- Definiere eine Funktion
ornament
: Sie soll den roten Streckenzug im rechten Muster zeichnen (links oben beginnend, wobei wir annehmen, dass die Turtle aktuell nach rechts schaut; am Ende soll sie dieselbe Blickrichtung haben wie am Anfang). Hinweis: Die roten Teilstücke sind 60, 40 und 20 Pixel lang. - Teste deine Funktion
ornament
. - Definiere eine Funktion
wiederholeOrnament
mit Parametern
: Sie solln
Mal die Funktionornament
aufrufen. (Dabei lernst du, dass eine Funktion eine andere aufrufen kann!) - Definiere eine Funktion
eckBewegung
: Sie soll den grünen Streckenzug zeichnen (rechts unten beginnend, wobei wir annehmen, dass die aktuelle Blickrichtung rechts ist; die Turtle soll dann am Ende nach oben schauen). - Schreibe nun das Hauptprogramm und verwende darin diese Funktionen in geschickter Weise, so dass ein Muster wie rechts oben (aber alles in Schwarz) entsteht. (Wenn du es genauso gross zeichnen willst, musst du die Schildkröte anfangs in die linke untere Ecke des Fensters bewegen und in die richtige Richtung schauen lassen.)
- Setze schliesslich die Stiftdicke auf 10, um das linke Muster zu bekommen.
Hausaufgabe (kann eventuell während der Lektion begonnen werden)
- Aufgabe 4 (Mäander) oder eine Variation deiner Wahl davon von ähnlicher Schwierigkeit
Abgabe bis spätestens Sonntagabend 23:59 Uhr vor der nächsten Doppellektion über den folgenden Link:
Überlegungen nach der Pause (wann auch immer diese stattfindet)
- Wozu sind Funktionen gut?
- Wie unterscheiden sich Funktionsaufruf und Funktionsdefinition?
- Was ist ein Parameter?
Struktur von Programmen
Python ist relativ tolerant, wo man Funktionen definiert. Trotzdem ist die folgende Reihenfolge zu empfehlen:
# Import von Bibliotheken from ... import ... # Definitionen von Funktionen def ...: def ...: # Beginn des Hauptprogramms, z. B. mit makeTurtle()
- Zuerst
import
-Anweisungen – sie stellen Funktionen (aus sogenannten Bibliotheken) bereit, die andere Leute bereits definiert haben.1) - Leerzeile
- Funktionsdefinitionen (jeweils mit
def
eingeleitet); man nennt Funktionen auch Teil- oder Unterprogramme; gibt es mehrere Funktionsdefinitionen, so werden sie durch mindestens eine Leerzeile getrennt. - Leerzeile
- Hauptprogramm (erst hier steht so etwas wie
makeTurtle()
)
Im Übrigen ist es guter Stil, Kommentare im Programm anzubringen (alles nach #
wird vom Computer ignoriert). Beispielsweise ist es zu empfehlen, bei jeder Funktion dazuzuschreiben, was sie tut und wie sie von eventuellen Parametern abhängt. Auch Leerzeilen machen ein längeres Programm oft übersichtlicher.
Zusammenfassung und Feedback
Zusammenfassung
- lehrkraefte/snr/informatik/bruehl-2022/funktionen.txt
- Last modified: 2022/04/02 13:23
- by Olaf Schnürer