Funktionen und Klassen

In Python ist es auch möglich bestimmte Programmteile in Funktionen oder Klassen auszulagern.

Funktionen

Funktionen beinhalten einen bestimmten Programmteil, der mehrmals verwendet wird. Funktionen haben den Vorteil, dass Sie einmal geschriebenen Code schnell und einfach in ein anderes Projekt kopieren können.

Eine Funktion wird in Python folgendermaßen geschrieben:

def <funktionsname> (<parameter>):
    <Anwesungen>

Beispielsweise sei das eine Funktion, die zwei Zahlen (a und b) miteiander addiert:

def sum (a, b):
    return (a+b)

Funktionen zeichnen sich dadurch aus, dass Sie Werte übergeben können und eine Antwort erhalten. Es ist auch möglich Tupel oder Listen zurückzugeben. Wollen Sie beispielsweise in Ihrem Hauptprogramm zwei Zahlen miteiander addieren könnte Ihre Python-Datei wie folgt aussehen:

def sum (a, b):
    return (a+b)
 
c=1
d=3
print "Die Summ aus 1 und 3 ist %d"%sum(c,d)

Beachten Sie, dass die Parameternamen nur innerhalb der Funktion gelten. Alle Änderungen, die Sie innerhalb der Funktion auf einen der Paramter (oder alle) anwenden werden beim Rücksprung in das Hauptprogramm (also die nächst höher liegende Funktion) wieder verloren gehen. Sie können nur Daten „retten“ indem Sie sie zurückgeben. Das geschiet mittels der return Anweisung.

Rekursion

Ein Sonderfall einer Funktion ist die rekursive Funktion - Sie ruft sich selbst wieder auf. Es macht manchmal Sinn Schleifen als rekursive Funktion zu implementieren. Zum Beispiel bei der Berechnung der Fakultät einer Zahl ist das angebracht. Um eine Rekursion zu implementieren brauchen Sie auch eine Abbruchbedingung - irgendwann muss die Funktion eine Zahl (oder irgendeinen Wert) zurückgeben, mitdem die rufende Funktion weiterarbeiten kann - so löst sich dann die Rekursion auf.

Die Fakultätsberechnung sei hier als Beispiel genannt. Wollen Sie 5! berechnen (gesprochen: 5 Fakultät), so rechnen Sie: 5*4*3*2*1=5! . Das lässt sich gut in eine rekursive Funktion umsetzen:

def fak(a):
    if a==0:
        return 1
    else
        return a*fak(a-1)

Wenn Sie diese Funktion zum Beispiel mit dem Wert 5 rufen, folgt:

fak(5) ruft fak(4);
fak(4) ruft fak(3);
fak(3) ruft fak(2);
fak(2) ruft fak(1);
fak(1) ruft fak(0);
fak(0) gibt den Wert 1 an fak(1) zurück.
fak(1) gibt den Wert 1*1 an fak(2) zurück.
fak(1) gibt den Wert 1*1*2 an fak(3) zurück.
fak(1) gibt den Wert 1*1*2*3 an fak(4) zurück.
fak(1) gibt den Wert 1*1*2*4 an fak(5) zurück.
fak(1) gibt den Wert 1*1*2*5 an das Hauptprogramm zurück.

Klassen

Klassen sind Verallgemeinerungen von Objekten. Sie können zum Beispiel ein konkretes Objekt Apfel haben, der eine Farbe hat, einen Geschmack (lecker, madig, sauer) und ein Volumen hat. Wollen Sie in Ihrem Programm mehrere Äpfel haben, dann erstellen Sie sich eine Klasse Apfel und erstellen daraus (instanziieren) eine Instanz Apfel1, Apfel2, … Eine Klasse ist in Python eine Ansammlung von Funktionen. Außerdem kann eine Klasse noch Attribute enthalten (wie beim Apfel: Farbe, Geschmack, Volumen).

So sieht im Allgemeinen eine Klassendefinition aus:

class <name>:
    def __init__ (self):
        <Konstruktor>
 
    def ... <Weitere Methoden>

Eine Klasse am Beispiel des Apfels könnte so aussehen:

class apfel:
    def __init__(self):
        self.geschmack="lecker"
        self.farbe="rot"
        self.volumen=20
 
    def essen(self, ges):
        self.volumen-=2
        return self.geschmack
 
    def setGeschmack(self, ges):
        self.geschmack=ges;

Beachten Sie, dass sie jeder Methode in der Definition self übergeben müssen, was sie beim Aufruf der Methoden des instantiierten Objekts nicht machen müssen.

Der Konstruktur

Der Konstruktur wird beim Instantiieren aufgerufen. Er dient dazu die Attribute zu setzen und zu initialisieren. Sie können zum Beispiel Parameter angeben, deren Wert dann in ein Attribut geschrieben wird. So erstellen Sein ein Objekt Apfel1:

apfel1=new apfel()

Wöllte man per Parameter beim Erzeugen des Objekts den Geschmack angeben, so könnte man das wie folgt tun. Zuerst die Definition des Konstruktors:

class apfel:
    def __init__(self, ges):
        self.geschmack=ges
        self.farbe="rot"
        self.volumen=20

Beim Aufruf des Konstruktors müssen Sie dann den Parameter mit angeben:

apfel1=new apfel("madig");

Getter / Setter

In der Objektorientierten Programmierung ist es mittlerweile zum guten Ton geworden Getter- und Setter-Methoden für die Klasse zu schreiben. Getter holen ein bestimmtes Attribut und geben des Wert zurück, Setter setzen des Wert eines Attribut. SetGeschmack (oben) ist ein Beispiel eines solchen Setters. Sie müssen keine Setter oder Getter schreiben - das steht Ihnen komplett frei. Wenn Sie in fremden Code auf get<Attributname> stoßen, wissen Sie dass es ein Getter ist für den Wert des Attributs mit dem Namen <Attributname>.