====== Eigene Funktionen definieren mit def ====== Wir haben gesehen, dass man mit ''def'' eigene Funktionen (oder Prozeduren) definieren kann. Hier werden wir etwas vertieft darauf eingehen. ==== Prozedur ==== Man spricht von **Prozedur**, wenn einfach eine Reihe von Befehlen abgearbeitet wird. Dies kann sehr nützlich sein, wenn man häufig dieselben Befehle in derselben Reihenfolge durchführen muss (z.B. bei turn_right in Reeborg). Dadurch kann man verhindern, dass man immer wieder dieselben Befehle eingeben muss (Redundanz). Den Namen kann man frei wählen, es hat sich in Python durchgesetzt, dass man alle Funktionen mit Kleinbuchstaben schreibt und Wörter durch Underscores trennt. Beispiel: def turn_right(): turn_left() turn_left() turn_left() === Argumente === Man kann einer Prozedur oder Funktion Argumente übergeben. Man könnte z.B. in Reeborg eine Prozedur schreiben, welche den Roboter vorwärts bewegt - und zwar so weit, wie man im Argument angibt: def move_some_squares(n): i = 0 while i < n: move() i = i + 1 Das Argument also hier **n** kann in der Funktion wie eine normale Variable verwendet werden. Eine Funkton kann auch mehrere Argumente haben. Z.B. ''zweichne_rechteck(a,b)'' (eine Prozedur, welche ein Rechteck der Seitenlängen a und b zeichnet). ==== Funktion ==== Man spricht von **Funktion**, wenn man nicht nur eine Abfolge von Befehlen ausführt, sondern wenn am Schluss auch noch ein Wert zurückgegeben wird. Dies entspricht dann einer mathematischen Funktion wie z.B. der Quadratfunktion. Die Rückgabe des Wertes macht man mit dem Befehl ''return''. def flaeche_rechteck(a,b): return a * b flaeche = flaeche_rechteck(3,6) print(flaeche) Wenn man also die Funktion ''flaeche_rechteck(3,6)'' aufruft, so erhält man einen Rückgabewert, den man in einer Variablen speichern kann. Man könnte ihn auch sonst in Ausdrücken verwenden, z.B. '' if flaeche_rechteck(3,6)>13:'' Wir werden für die Funktionen wieder auf die Tigerjython-Umgebung umsteigen (in Reeborg gibt es wenige Möglichkeiten, Funktionen mit Parameter zu verwenden. Arbeite also entweder in der Tigerjython-Umgebung, welche auf deinem Computer installiert ist, oder öffne die Online-Version von [[http://www.pythononline.ch/pyonline/PyOnline.php|pythononline.ch]] - Schreibe eine Prozedur ''dreieck()'', welche mit der Turtle ein gleichseitiges Dreieck mit Seitenlänge 100 zeichnet - Verbessere deine Prozedur, so dass man als Argument die Seitenlänge angeben kann: ''dreieck(s)'' - Schreibe eine Prozedur ''rechteck(a,b)'' welche ein Rechteck zeichnet mit Seitenlänge a und b. - Schreibe eine Prozedur ''n_eck(n,l)'' , welche ein n-Eck mit Seitenlänge l zeichnet. - Versuche die Aufgaben bei Pythononline -> Turtlegrafik -> Funktionen zu lösen - Versuche die Aufgaben bei Pythononline -> Turtlegrafik -> Parameter zu lösen ===Lokale und globale Variablen === Wenn man Variablen in Funktionen oder ausserhalb von Funktionen verwendet, so muss man aufpassen und den sogenannten "Gültigkeitsbereich" berücksichtigen. D.h. Variablen, die innerhalb einer Funktion zum ersten Mal verwendet werden, sind **lokale Variablen** - sie sind ausserhalb der Funktion nicht gültig. Variablen, die ausserhalb einer Funktion definiert werden (d.h. das erste Mal verwendet werden), nennt man **globale Variablen**. Was macht wohl das untenstehende Programm? Erkläre. Wie viele "Treppenstufen" werden gezeichnet und warum? Wie könnte man "von aussen" steuern, wie viele Treppen gezeichnet werden? from gturtle import * makeTurtle() n = 3 def zeichne(): n = 10 repeat n: right(90) forward(20) left(90) forward(20) zeichne() repeat n: right(90) forward(50) left(90) forward(50) **Lösung** Es werden 10 kleine und 3 grosse Treppenstufen gezeichnet. Da in der Funktion ein **neues** n definiert wird (eine lokale Variable) ist diese ausserhalb nicht mehr gültig - sobald die Funktion verlassen wird, wird dieses zweite n gelöscht. Das untere repeat nimmt deshalb nicht n=10 sondern das global definierte n=3. Möchte man das globale n in einer Funktion drin überschreiben, so muss man in der Funktion ''global n'' schreiben. So weiss Python, dass sich das n auf die **globale Variable** n bezieht und er erstellt kein lokales n, sondern verwendet die **globale Variable**. Von aussen kann man dies steuern, indem man entweder die globale Variablen verwendet (in der Funktion ''global n'' schreibt, oder indem man die Funktion ''zeichne'' mit einem Parameter definiert ''zeichne(anzahl)'', so kann man dann der Funktion einen Wert als Argument übergehen.