archiv:gf:gf2020_2021:python:funktionen

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.

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

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 pythononline.ch

  1. Schreibe eine Prozedur dreieck(), welche mit der Turtle ein gleichseitiges Dreieck mit Seitenlänge 100 zeichnet
  2. Verbessere deine Prozedur, so dass man als Argument die Seitenlänge angeben kann: dreieck(s)
  3. Schreibe eine Prozedur rechteck(a,b) welche ein Rechteck zeichnet mit Seitenlänge a und b.
  4. Schreibe eine Prozedur n_eck(n,l) , welche ein n-Eck mit Seitenlänge l zeichnet.
  5. Versuche die Aufgaben bei Pythononline → Turtlegrafik → Funktionen zu lösen
  6. 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.

  • archiv/gf/gf2020_2021/python/funktionen.txt
  • Zuletzt geändert: 2022/08/27 18:08
  • von lehmannr