Vorlesungsskript 15

Verzweigungen und Boole’sche Ausdrücke

Verzweigungen mit if

Die Objekte des Typs boolTrue und False – sind Boole’sche Werte (engl. boolean values oder kurz booleans), benannt nach dem Mathematiker und Logiker George Boole. Diese zwei Werte spielen eine wichtige Rolle, wenn Programme Entscheidungen zwischen zwei möglichen Anweisungen treffen müssen.

Das wichtigste Werkzeug in Python, um Programme Entscheidungen treffen zu lassen, sind if-Anweisungen. if-Anweisungen sind (wie for-Schleifen) Blockanweisungen: Sie beginnen mit einem Kopf und gehen mit einem eingerückten Körper aus beliebig vielen Anweisungen weiter. Hier ist ein einfaches Beispiel:

if suitcase_weight_kg > 20:
    print('Wir berechnen Ihnen 25 EUR Gepäckzuschlag.')
print('Vielen Dank, dass Sie mit uns fliegen.')

Dieser Code prüft, ob die Zahl in der Variablen suitcase_weight_kg größer als 20 ist. Nur, wenn das so ist, wird der Körper – der eingerückte Teil – ausgeführt. Dann geht es in beiden Fällen mit dem ausgerückten Teil weiter; dieser ist nicht mehr Teil der if-Anweisung.

Allgemein gilt: Der Kopf einer if-Anweisung besteht aus dem Schlüsselwort if, einem Ausdruck, der True oder False zurückgibt (der sogenannten Bedingung), und einem Doppelpunkt. Nur, wenn der Ausdruck True zurückgibt, wird der Körper der if-Anweisung ausgeführt.

else und elif

Im Gegensatz zur for-Schleife kann eine if-Anweisung mehrere Köpfe und Körper haben. Denn erstens kann man sie um einen else-Teil erweitern, dessen Körper Anweisungen für den Fall enthält, dass die Bedingung False zurückgibt. Zum Beispiel:

if suitcase_weight_kg > 20:
    print('Wir berechnen Ihnen 25 EUR Gepäckzuschlag.')
else:
    print('Kein Gepäckzuschlag.')
print('Vielen Dank, dass Sie mit uns fliegen.')

Und zweitens können zwischen dem if-Teil am Anfang und dem else-Teil am Ende beliebig viele elif-Teile (für else if) stehen. Diese prüfen weitere Bedingungen, falls die vorherigen Bedingungen alle False zurückgegeben haben. So kann man zwischen mehr als zwei Fällen unterscheiden:

if suitcase_weight_kg > 30:
    print('Wir berechnen Ihnen 50 EUR Gepäckzuschlag.')
elif suitcase_weight_kg > 20:
    print('Wir berechnen Ihnen 25 EUR Gepäckzuschlag.')
else:
    print('Kein Gepäckzuschlag.')
print('Vielen Dank, dass Sie mit uns fliegen.')

Bei einem Koffer mit 31 kg gibt dieses Programm z.B. aus:

Wir berechnen Ihnen 50 EUR Gepäckzuschlag.
Vielen Dank, dass Sie mit uns fliegen.

Beachten Sie, dass auch die zweite Bedingung (suitcase_weight_kg > 20) hier True zurückgeben würde. Sie wird aber gar nicht erst geprüft, da bereits die erste Bedingung erfolgreich war. Es gilt: Immer höchstens ein Körper einer if-Anweisung wird ausgeführt.

Bei einem Koffer mit 21 kg gibt dieses Programm aus:

Wir berechnen Ihnen 25 EUR Gepäckzuschlag.
Vielen Dank, dass Sie mit uns fliegen.

In diesem Fall gibt die erste Bedingung False zurück, daher wird die zweite Bedingung geprüft. Sie gibt True zurück, also wird der zweite Körper ausgeführt. Der Rest wird übersprungen.

Auch, wenn wir elif verwenden, ist else optional. Wenn keine der Bedingungen wahr ist, kann auch einfach nichts ausgeführt werden:

if suitcase_weight_kg > 30:
    print('Wir berechnen Ihnen 50 EUR Gepäckzuschlag.')
elif suitcase_weight_kg > 20:
    print('Wir berechnen Ihnen 25 EUR Gepäckzuschlag.')
print('Vielen Dank, dass Sie mit uns fliegen.')

Weitere Beispiele

Hier ist noch ein Beispiel, das den Benutzer unterschiedlich begrüßt, je nach seinem Namen:

if user_name.starts_with('Prof.'):
    print('Good morning, professor!')
elif user_name == 'Ron':
    print('Hi, Ron!')
elif user_name == 'Hermione':
    print('Hi, Hermine!')
else:
    print('Hi, who are you?')

Das folgende Programm iteriert über eine Liste von Tierbezeichnungen und legt ein Dictionary an, das zählt, wie oft jedes Tier vorkommt. In der Schleife wird immer erst mit Hilfe einer if-Anweisung geprüft, ob das jeweilige Tier bereits als Schlüssel im Dictionary existiert. Falls nicht, wird die Anzahl auf 1 gesetzt (es ist das erste Tier dieser Art). Falls ja, wird der bestehende Wert um 1 erhöht:

animals = ['cat', 'dog', 'cat', 'dog', 'dog', 'snail']
animal_counts = {}
for animal in animals:
    if animal in animal_counts:
        animal_counts[animal] += 1
    else:
        animal_counts[animal] = 1
print animal_counts

Es gibt aus:

{'cat': 2, 'dog': 3, 'snail': 1}

„Truthy“ und „falsy“

Ausdrücke, die als Bedingungen verwendet werden, müssen nicht wirklich unbedingt vom Typ bool sein. Python kann auch manche anderen Objekte als „wahr“ oder „falsch“ interpretieren. Das Objekt None, die Zahlobjekte 0 und 0.0, der leere String '', die leere Liste [] und das leere Dictionary {} sind „falsy“, d.h., sie gelten als falsch. Alle anderen Objekte der Typen int, float, str, list und dict sind „truthy“, d.h., sie gelten als wahr.

So kann man z.B. mit einer if-Anweisung prüfen, ob eine Liste leer ist:

if animals:
    print('Tiere vorhanden.')
else:
    print('Keine Tiere vorhanden.')

Mit der Funktion bool kann man Objekte explizit zu True bzw. False konvertieren:

>>> bool(None)
False
>>> bool(0)
False
>>> bool(2)
True
>>> bool(0.0)
False
>>> bool(0.1)
True
>>> bool('')
False
>>> bool('abc')
True
>>> bool(' ')
True
>>> bool([])
False
>>> bool([0])
True
>>> bool({})
False
>>> bool({'a': 1, 'b': 2})
True

Boole’sche Ausdrücke

Mit den logischen Operatoren and, or, ^ und not kann man Boole’sche Werte logisch verknüpfen:

Ausdruck Gibt True zurück, wenn …
a and b …der Boole’sche Wert a und der Boole’sche Wert b beide True sind.
a or b …mindestens einer der Boole’schen Werte a und b True ist.
a ^ b genau einer der Boole’schen Werte a und b True ist.
not a …der Boole’sche Werte a False ist.

Zum Beispiel:

>>> True and True
True
>>> True and False
False
>>> False and True
False
>>> False and False
False
>>> True or True
True
>>> True or False
True
>>> False or True
True
>>> False or False
False
>>> True ^ True
False
>>> True ^ False
True
>>> False ^ True
True
>>> False ^ False
False
>>> not True
False
>>> not False
True

Im folgenden Beispiel verwenden wir den or-Operator, um das Grüßprogramm von oben etwas kompakter zu schreiben:

if user_name.starts_with('Prof.'):
    print('Good morning, professor!')
elif user_name == 'Ron' or user_name == 'Hermione':
    print('Hi, {}!'.format(user_name))
else:
    print('Hi, who are you?')

Logische Operatoren erlauben komplexere Bedingungen, wie in folgendem Code-Beispiel, in dem Premium-Kundinnen der Übergepäckzuschlag erspart wird:

if suitcase_weight_kg > 20 and not premium_customer:
    print('Wir berechnen Ihnen 25 EUR Gepäckzuschlag.')
print('Vielen Dank, dass Sie mit uns fliegen.')