Vorlesungsskript 15
Verzweigungen und Boole’sche Ausdrücke
Verzweigungen mit if
Die Objekte des Typs bool
– True
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.')