Skip to article frontmatterSkip to article content

3.3Kontrollstrukturen

Humboldt-Universität zu Berlin, Institut für Bibliotheks- und Informationswissenschaft

Bevor wir uns die Speicherung von Python-Code in verschiedenen Dateien ansehen führen wir zuerst ein paar Konzepte des Kontrollflusses bzw. der Kontrollstrukturen, die den Programmfluss beeinflussen an.

Bisher haben wir in der REPL nacheinander einzelne Schritte eingegeben und ausgeführt. In den Beispielen gab es ab und zu Code-Zellen, in denen mehrere Python-Ausdrücke untereinander standen. All das bietet den ersten Hinweis auf das Standardverhalten von Python-Code:

Dies ist zu sehen an den folgenden zwei Code-Beispielen.

Beispiel 1:

a = 5
a *= 2
a += 1
print(a)
11

Beispiel 2:

a = 5
a += 1
a *= 2
print(a)
12

Nachvollziehen Sie die beiden Code-Beispiele. Welchen Wert hat die Variable mit dem Namen a nachdem jeweils der Ausdruck in jeder Zeile ausgeführt wurde? Welche Werte erhalten Sie, wenn Sie jeweils nicht a += 1 ausführen sondern a += 3?

if-Anweisung

Einfach nur den Code von oben nach unten auszuführen reicht oft nicht aus um das gewünschte Ergebnis zu erhalten.

Nehmen Sie an, dass Sie Python-Code schreiben sollen, der den Wert in einer Variablen zahl halbieren soll, wenn der Wert größer als 10 ist. Ansonsten soll er unberüht bleiben.

Wie schon in der deutschsprachigen Beschreibung des Problems zu sehen soll etwas nur dann getan werden, wenn eine Bedingung zutrifft. In Python ist dies mit dem if-Anweisung möglich.

zahl = 6
if zahl > 10:
    zahl = zahl / 2
print(zahl)
6

Ändern Sie den Wert von Zahl um zu sehen, ob der if-Anweisung korrekt auslöst.

Nun soll der Code zusätzlich 3 zur zahl addieren, falls zahl kleiner oder gleich 10 ist. Dies geht mit der Erweiterung der if-Anweisung um else.

zahl = 6
if zahl > 10:
    zahl = zahl / 2
else:
    zahl += 3
print(zahl)
9

Gibt es mehrere Wertebereiche, in denen die Zahl unterschiedlich verarbeitet werden soll, so können Sie diese mit elif zwischen dem if und dem else definieren.

Was passiert mit der Zahl im nachfolgenden Beispiel? Nachvollziehen Sie den ausgeführten Code und ändern Sie die Zahl um alle “Zweige” der if-Anweisung(en) einmal auszulösen.

zahl = 6
if zahl > 10:
    zahl = zahl / 2
elif zahl > 5 and zahl <=10: # mit `and` können Sie mehrere Bedingungen verknüpfen
    if zahl % 2 == 0:        # mit `==` überprüfen Sie ob beide Seiten gleich sind.
        zahl += 1
else:
    zahl += 3
print(zahl)
7

Darf die Nutzer*in die gewünschte Anzahl an Büchern ausleihen?

Funktionen

Wenn Sie die Beispiele zum if-Ausdruck nacheinander abgetippt haben, ist Ihnen sicher die viele Wiederholung aufgefallen.

Wollen wir den Kontostand und die Möglichkeit einer Ausleihe mehrmals nutzen, so wäre es unschön, wenn wir immer wieder den ganzen Code kopieren müssten. Hier setzten Funktionen an.

Sie haben schon mindestens die Funktion print() genutzt, welche Ihnen eine gewisse Funktionalität – das Ausgeben von Zeichenketten und Werten – ermöglicht, ohne, dass Sie jedes Mal (oder überhaupt) wissen müssen, wie man Text in der REPL, im Terminal, oder in JupyterLab ausgibt.

Die Idee einer Funktion ist es, mehrere Zeilen Code als eine Einheit zusammenzustellen und diese über einen Funktionsaufruf wieder ausführen zu können. Im obigen Beispiel wäre das der if-Ausdruck. Zusätzlich zum if-Ausdruck müssen auch kontostand und aktuell korrekt beim Funktionsaufruf definiert sein.

Um Werte “in die Funktion” zu übermitteln definieren wir sog. Parameter. Um einen Wert aus der Funktion herauszubekommen (zum Beispiel den aktualisierten Kontostand), gibt es einen Rückgabewert.

Das ganze könnte dann so aussehen:

def ausleihe_überprüfen(kontostand, aktuell):
    summe = kontostand + aktuell # in einer Funktion können Sie Variablen erstellen um Zwischenergebnisse zu speichern
    if summe > 15:
        print(f"Sie haben bereits {kontostand} Bücher ausgeliehen.\nWenn Sie {aktuell} Bücher ausleihen würden,\nkämen Sie über die Grenze von 15 Büchern.\n\nSie können aktuell maximal {15 - kontostand} weitere Bücher ausleihen.")
        return kontostand # Eine Ausleihe war nicht möglich, es wird der alte Kontostand zurückgegeben.
    elif summe >= 10: 
        print(f"Ihr neuer Kontostand: {summe} Bücher.")
        return summe # Die Ausleihe war erfolgreich und der neue Kontostand wird zurückgegeben.
    else:
        print("Ausleihe erfolgreich.")
        return summe # Auch hier war die Ausleihe erfolgreich und es wir der neue Kontostand zurückgegeben.

Die Funktionsdefinition wurde ausgeführt wodurch der Name ausleihe_überprüfen() nun verfügbar ist. Ausgegeben wurde jedoch nichts, da die Funktion noch nicht aufgerufen wurde.

neuer_kontostand = ausleihe_überprüfen(8, 3)
print(neuer_kontostand)
Ihr neuer Kontostand: 11 Bücher.
11