funktionen

5. FUNKTIONEN

 

 

DU LERNST HIER...

 

wie man Programme strukturiert, indem man eigene Befehle, in Python Funktionen genannt,  definiert. Eine Funktion ist eigentlich ein benannter Programmblock, den man mit seinem Namen ausführen lassen kann.

 

 

MUSTERBEISPIEL

 

In den vorhergehenden Kapiteln hast du vielfach als Teilaufgabe ein Quadrat gezeichnet. Es ist daher sinnvoll, dieser Teilaufgabe einen Namen square zu geben, damit du den Programmcode immer wieder unter diese Namen verwenden kannst.

Die Funktionsdefinition beginnt die mit dem Keyword def. Dann folgt der Name, eine sogenannte Parameterklammer und ein Doppelpunkt. Nach diesem Funktionskopf folgt der Funktionskörper, der aus irgendwelchem Programmcode besteht.

 

Die Funktionsdefinition def square(): legt allerdings nur fest, wie ein Quadrat zu zeichnen ist. Das Quadrat wird aber erst weiter unten im Programm tatsächlich gezeichnet, nämlich beim Funktionsaufruf. Da Funktionsdefinitionen vor dem Aufruf stehen müssen, setzen wir alle Funktionsdefinitionen gemeinsam in den obersten Teil des Programms.

In deinem Programm rufst du square() dreimal auf.

from gturtle import *

def square():
    repeat 4: 
        forward(100) 
        left(90) 

makeTurtle()
setPenColor("red")
square()
right(120)
setPenColor("blue")
square()
right(120)
setPenColor("green")
square()
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

Die Funktionsnamen kannst du ziemlich frei und nach deinem eigenen Geschmack wählen, du musst dich aber an ein paar Einschränkungen halten. Erlaubte Bezeichner sind Wörter

  • ohne Umlaute und Spezialzeichen, ausser $ und _ (also mit den Buchstaben a..z, A..Z, den Zahlen 0..9, sowie $ und _).
  • Sie dürfen nicht mit einer Zahl beginnen und
  • dürfen keine Keywords sein.

Erlaubt sind also: quadrat, zeichneKreis, mySub1, print_result
Nicht erlaubt sind: 1wochentag, im.dezember, führeaus, komm her

Wir halten uns zudem an die Regel, dass Bezeichner im CamelCase geschrieben werden. Dabei werden Wortgruppen aneinander gefügt und ein neues Wort beginnt immer mit einem Grossbuchstaben, also beispielsweise fillSquare, myFirstFunction, RobotClass. Dadurch werden die Programme auch für andere Personen besser lesbar.

Schliesslich ist es ein weit verbreiterter Standard, Funktionsbezeichner immer mit einem Kleinbuchstaben (oder notfalls dem _) zu beginnen, also drawFigure und nicht DrawFigure. Da Funktionsbezeichner möglichst vielsagend sein sollten, solltest du eher Verbformen als Substantive einsetzen, also drawFigure eher als  figure, zudem eignen sich englischsprachliche Bezeichner besser, da so deine Programme universell lesbar sind.

 

 

ZUM SELBST LÖSEN

  1.

Definiere einen Befehl sechseck(), mit dem die Turtle ein Sechseck zeichnet. Verwende diesen Befehl, um die nebenstehende Figur zu erstellen.

 


  2a.

Definiere einen Befehl für ein Quadrat, das auf der Spitze steht und zeichne damit die nebenstehende Figur.

 
  2b.

Zeichne gefüllte Quadrate.

 


  3a.

Du erlebst in der folgenden Aufgabe, wie du unter Verwendung von Funktionen ein Problem schrittweise lösen kannst.

Definiere eine Funktion bogen(), mit der die Turtle einen Bogen zeichnet und sich dabei insgesamt um 90 Grad nach rechts dreht. Mit speed(-1) bewegt sich die Turtle schneller.

 
 
3b.


Ergänze das Programm mit der Funktion blumenblatt(), welche zwei Bogen zeichnet. Die Turtle sollte am Ende aber wieder in Startrichtung stehen.

 
  3c.

Ergänze das Programm so, dass blumenblatt() ein rot gefülltes Blatt (ohne sichtbare Umrandungslinie) zeichnet.

 
  3d.

Erweitere das Programm mit der Funktion blume() so, dass eine 5-blättrige Blume entsteht. Damit die Blume noch schneller erscheint, kannst du mit hideTurtle() die Turtle bereits am Anfang unsichtbar machen.

 
  3e*

Mit setRandomPos(600, 400) kannst du die Turtle an eine zufällige Position im x-Bereich zwischen -300 und 300 und y-Bereich zwischen -200 und 200 setzen. Zeichne damit 10 Blumen an zufälligen Positionen. (Die Grösse des Turtlefensters hängt von der Wahl in den Einstellungen von TigerJython ab.)

 

  4.

Dein Programm soll ein Feld mit 8x8 Kreisen, die wie ein Schachbrett mir zwei Farben gefüllt sind, zeichnen. Löse die Aufgabe schrittweise mit Hilfe von Funktionen.

  • Definiere zuerst eine Funktion row() die einen Reihe mit 8 Kreisen zeichnet, die abwechslungsweise mit rot oder grün gefüllt sind. Für das Zeichnen der Kreise verwendest du den Befehl dot(60).
  • Versetze die Turtle mit setPos(-210, 210) an die Position (-210, 210) rufe die Funktion row() auf, um das Zeichnen der ersten Reihe zu testen.
  • Definiere eine Funktion turnRight(), die am Ende der Reihe die Turtle an die Position bringt, wo sie mit dem Zeichnen der zweiten Reihe beginnen kann.
  • Da am Ende der zweiten Reihe eine Drehung nach links erfolgen muss, damit man zu der dritten Reihe gelangt, musst du eine weitere Funktion turnLeft() definieren.

  • Rufe in einer repeat-Schleife diese Funktionen mehrmals auf, so dass die Turtle 8 Reihen mit rot und grün gefüllten Kreisen zeichnet.

 

     

 

 

 

   

 

5-1
Didaktische Hinweise:

In der Mathematik verwendet man den Begriff Funktion für eine Abbildung, die Eingabeparametern (Argumenten) einen einzigen Ausgabewert zuordnet. In der Informatik wird ein anderer Funktionsbegriff verwendet: Hier handelt es sich um ein Teilprogramm, dem man bestimmte Parameterwerte übergeben kann und das beim Aufruf den darin definierten Code ausführt. Die Funktion kann Werte zurückgeben oder auch nicht.

In gewissen Programmiersprachen bezeichnet man Funktionen, die keinen Wert zurückgeben als "Prozeduren" oder "Funktionen mit void-Rückgabe".

In diesem Kapitel werden Funktionen betrachtet, die keinen Rückgabewert haben und erst später Funktionen mit Rückgabewert.

Es kann nicht genügend betont werden, wie wichtig es ist, ein Programm durch Funktionen zu strukturieren. Selbst wenn ein Programmblock nur einmal verwendet wird, macht es Sinn, ihn als Funktion zu definieren, da durch die Namensgebung auch seine Aufgabe beschrieben wird.

Obschon eigentlich strukturiertes und modulares Programmieren Überbegriffe zu funktionalem und prozeduralem Programmieren ist, werden in diesem Lehrgang alle Begriffe synonym verwendet. Ebenso werden manchmal Funktionen auch Unterprogramme genannt.

Funktionen bilden auch die Grundlage von Programmbibliotheken, beispielsweise sind ja eigentlich alle Tutlebefehle Funktionen des Turtlemoduls. Funktionen dienen hier vor allem der Wiederverwendbarkeit von Code. Da die Funktionsdefinitionen bei Bibliotheken entweder nicht bekannt ist oder nicht interessiert, entspricht modulares Programmieren auch dem Geheimnisprinzip, bei dem von gewissem Code nur die Schnittstelle, das API (Application Programming Interface), bekannt ist und die Implementierung geheim gehalten wird.

Bei der Strukturierung von Code mittels Funktionen spricht man auch vom Prinzip von Teile und Herrsche, wo man versucht, eine grössere Komplexität durch Einteilung in wohldefinierte Teilschritte bzw. Einzelaufgaben zu beherrschen. Wenn man die Teilschritte wieder in Teilschritte einteilt, spricht man auch von schrittweiser Verfeinerung oder dem Top-Down-Programmieren.

Es ist klar, dass man in einem Einführungskurs kurzer Dauer keine Theorie über Programm-Management und -Design vermittelt, sondern die Prinzipien darüber stillschweigend exemplarisch anwendet.

5-2
Fachliche Hinweise:

Es gehört nicht zum guten Programmierstil, Codeteile und Funktionsdefinitionen zu mischen, obschon dies in Python möglich ist.

5-3
Didaktische Hinweise:

Die günstige Wahl der Bezeichner (Identifier) ist für eine gute Lesbarkeit des Programms von grosser Wichtigkeit. Aus diesem Grund wird hier so ausführlich darüber gesprochen. Schlechte Bezeichner zeugen von einem unseriösen Programmierstil.

5-4
Didaktische Hinweise:

Die Idee zu dieser Aufgabe stammt von Seymour Papert, dem Vater von Logo und der Turtlegrafik, und wurde bereits 1980 in seinem Standardwerk "Mindstorms - Children, Computers and Powerful Ideas" publiziert.