Bedingte Anweisungen

Unvermeidliche Entscheidungen

Manche Entscheidungen sind unvermeidlich

Zu bestimmten Zeiten und gewissen Situationen sind Entscheidungen unvermeidlich, da trennen sich die Wege von Mann und Frau, wie man im Foto sehen kann. So kann man auch kaum ein sinnvolles Programm oder Skript schreiben, was ohne jede Verzweigung auskommt.

In einer Programmiersprache versteht man unter einer bedingten Anweisung, wie man Verzweigungen auch nennt, Codeteile, die unter einer Bedingung ausgeführt, werden. Liegt die Bedingung nicht vor, wird dieser Code nicht ausgeführt. Anders ausgedrückt: Eine Verzweigung legt fest, welcher von zwei (oder auch mehr) Programmteilen (Alternativen) in Abhängigkeit von einer (oder mehreren) Bedingungen ausgeführt wird. Bedingte Anweisungen und Verzweigungen werden in Programmiersprachen (ebenso wie die Schleifen) den Kontrollstrukturen zugerechnet, weil mit ihrer Hilfe ein Programm auf verschiedene Zustände, die sich aus Eingaben und Berechnungen ergeben, reagieren kann.

Im abschließenden Beispiel dieses Kapitels verwenden wir einen historischen Einkommensteuertarif von 2014 als reine Programmierübung. Das Beispiel dient nur dazu, Verzweigungen zu demonstrieren und ist kein aktueller Steuerrechner.

Die if-Anweisung

Die if-Anweisung wird benutzt, um den Programmablauf in einem Python-Programm zu steuern. Damit wird es möglich zur Laufzeit zu entscheiden, ob bestimmte Programmteile ausgeführt werden sollen oder nicht.

Die einfachste Form einer if-Anweisung in einem Python-Programm sieht folgendermaßen aus:

if bedingung:
	anweisung
	anweisung
	#...weitere Anweisungen, falls nötig

Der eingerückte Block wird nur dann ausgeführt, wenn die Bedingung "bedingung" zutrifft. Sprich, wenn sie logisch "true" ist.

Im folgenden Beispiel wird der Benutzer nach seiner Nationalität gefragt. Der eingerückte Block wird nur ausgeführt, wenn die Nationalität "french" ist. Sollte der Benutzer eine andere Nationalität eingeben, passiert nichts.

person = input("Nationalität? ")
if person == "french":
    print("Préférez-vous parler français?")
Nationalität? french
Préférez-vous parler français?

Bitte beachten Sie: Wird hier "French" eingegeben, passiert nichts, denn Stringvergleiche unterscheiden Groß- und Kleinschreibung. Für Benutzereingaben, die unabhängig von der Schreibweise verglichen werden sollen, kann man beispielsweise casefold() verwenden:

if nationality.casefold() == "french":
    ...

Im nächsten Schritt erweitern wir die Bedingung zunächst mit or.

Der italienische Kollege würde sich jetzt möglicherweise benachteiligt fühlen, weil italienisch sprechende nicht berücksichtigt wurden. Wir erweitern das Programm um eine weitere if-Anweisung.

person = input("Nationalität? ")
if person == "french" or person == "French":
    print("Préférez-vous parler français?")
Nationalität? French
Préférez-vous parler français?
person = input("Nationalität? ")
if person == "french" or person == "French":
    print("Préférez-vous parler français?")
if person == "italian" or person == "Italian":
    print("Preferisci parlare italiano?")
Nationalität? italian
Preferisci parlare italiano?

Dieses kleine Skript hat einen Nachteil. Nehmen wir an, dass der Benutzer "french" als Nationalität eingibt. In diesem Fall wird der Block des ersten "if" ausgeführt. Anschließend prüft das Programm aber noch, ob das zweite "if" ebenfalls ausgeführt werden kann. Das passiert hier natürlich nicht, denn die Eingabe "french" passt nicht zu der Bedingung "italian" oder "Italian". Im Endeffekt ist dies eine unnötige Prüfung, wenn "french" oder "French" eingegeben wird.

Wir lösen das Problem mit einer "elif"-Bedingung. Der Ausdruck wird nur geprüft, wenn der Ausdruck des vorherigen "elif" oder "if" false war.

person = input("Nationalität? ")
if person == "french" or person == "French":
    print("Préférez-vous parler français?")
elif person == "italian" or person == "Italian":
    print("Preferisci parlare italiano?")
else:
    print("Du bist weder Italiener noch Franzose.")
    print("Deshalb reden wir jetzt deutsch!")
Nationalität? Türkisch
Du bist weder Italiener noch Franzose.
Deshalb reden wir jetzt deutsch!

Wie in unserem Beispiel gibt es in den meisten if-Anweisungen ebenfalls "elif"- und "else"-Zweige. Sprich, es kann mehr als einen "elif"-Zweig geben, aber nur einen "else"-Zweig. Der "else"-Zweig muss am Ende der if-Anweisung stehen. Weitere "elif"-Zweige können nicht hinten angestellt werden.

Beispiel Hundejahre

Für Kinder und Hundeliebhaber ist es eine interessante und häufig gestellte Frage, wie alt ihr Liebling wohl wäre, wenn er kein Hund sondern ein Mensch wäre. Zur Berechnung dieser Aufgabe gibt es verschiedene wissenschaftliche und pseudowissenschaftliche Ansätze. Landläufig rechnet man Hundejahre in Menschen-Jahre um, indem man das Alter des Hundes mit 7 multipliziert. Je nach Hundegröße und Rasse sieht die Umrechnung jedoch etwas komplizierter aus, z.B.:

  • Ein einjähriger Hund entspricht in etwa einem 14-jährigen Menschen
  • Ein Hund der zwei Jahre alt ist, entspricht entwicklungsmäßig einem 22-jährigen Menschen.
  • Jedes weitere Hundejahr entspricht fünf Menschenjahre.

Das folgende kleine Beispielprogramm in Python verlangt die Eingabe für das Alter des Hundes und berechnet nach obiger Regel das Alter in Menschenjahren:

age = int(input("Alter des Hundes: "))
print()
if age < 0:
    print("Das stimmt wohl kaum!")
elif age == 0:
    print("Entspricht 0 Menschenjahre!")
elif age == 1:
    print("Entspricht ca. 14 Jahre!")
elif age == 2:
    print("Entspricht ca. 22 Jahre!")
elif age > 2:
    human = 22 + (age -2) * 5
    print("Das entspricht ca. " + str(human) + " Menschenjahre!")
Alter des Hundes: 5

Das entspricht ca. 37 Menschenjahre!

Wir werden obiges Programm in unserem Python-Tutorial noch einmal im Kapitel "Funktionen" aufgreifen, um daraus eine Funktion zu machen.

Das obige Programm kann man auch mit einer zusätzlichen Variable schreiben, so dass das print nur einmal am Schluss des Programmes erscheint. Das ist stilistisch besser:

dog_age = int(input("Alter des Hundes: "))
print()
if dog_age <= 0:
    human_age = -1
elif dog_age == 1:
    human_age = 14
else:
    # this means: dog_age >= 2:
    human_age = 22 + (dog_age - 2) * 5

if human_age > 0:
    print("Entspricht " + str(human_age) + " Menschenjahren!")
else:
    print("Negative Werte oder Null ergeben keinen Sinn!")
Entspricht 42 Menschenjahren!

Wahr oder falsch: Truthiness

Eine Bedingung in Python muss nicht ausdrücklich True oder False enthalten. Python bestimmt den Wahrheitswert eines Objekts nach festen Regeln.

Als falsch (falsy) gelten insbesondere:

  • None und False,
  • numerische Nullwerte wie 0, 0.0 und 0j,
  • leere Sequenzen und Collections, zum Beispiel "", [], (), {} und set(),
  • Instanzen benutzerdefinierter Klassen, deren __bool__() False liefert oder deren __len__() den Wert 0 liefert.

Andere Objekte gelten normalerweise als wahr (truthy). Deshalb kann man beispielsweise statt if len(liste) > 0: idiomatisch if liste: schreiben.

Damit erklären sich Bedingungen, die nur aus einem Variablennamen bzw. Ausdruck bestehen.

my_list = eval(input("Type in list: "))

my_list_with_strings = []
while my_list:
    element = my_list.pop(0) 
    if type(element) != str:
        element = str(element)
    my_list_with_strings.append(element)

print(my_list_with_strings)
['3', '5', '(34, 5)']

Die Schleife läuft über die Liste my_list. In jedem Schleifendurchlauf wird das Listenelement mit dem Index 0 mittels my_list.pop(0) aus der Liste entnommen. Alle Elemente von my_list werden in die Liste rev_list als Strings übernommen. Die Schleife endet, sobald my_list keine Elemente mehr enthält. Eine leere Liste entspricht ja nach dem oben Gesagten einem Wahrheitswert False!

Ternäres if

C-Programmierer kennen folgende abgekürzte Schreibweise für das if-Konstrukt:

max = (a > b) ? a : b; 

als Abkürzung für:

if (a > b)
   max=a;
else
   max=b;  

In Python müssen sich C-Programmierer, was diese Schreibweise betrifft, umgewöhnen. In Python formuliert man das vorige Beispiel wie folgt:

max = a if (a > b) else b

Eigentlich ist es natürlich mehr als nur eine abgekürzte Schreibweise für eine standard if-Anweisung. Man kann das ternäre if auch innerhalb eines Ausdrucks verwenden:

a = 17
b = 50
result = (21 if a < b else 7) * 2 
result
Ausgabe:
42

Steuerrechner in Python

Ein praktisches Beispiel für bedingte Anweisungen stellt die Einkommenssteuerberechnung dar. Das zu versteuernde Einkommen (zvE) muss einer Tarifzone zugeordnet werden, wozu sich eine if-Anweisung anbietet. Der Steuerbetrag (StB) bei Einzelveranlagung wird nach den entsprechenden Formeln berechnet:1

Erste Zone (Grundfreibetrag): bis 8353,- € fällt keine Steuer an
Zweite Zone: zvE von 8.354 € bis 13.469 €
StB = (974,58 * y + 1400)*y
Für y gilt:
y = (zvE - 8004) / 10000
Dritte Zone: zvE von 13470 € bis 52881 €
StB = (228,74 * z + 2397)*z + 971
Für z gilt:
z = (zvE - 13469) / 10000
Vierte Zone: zvE von 52882 € bis 250730 €
StB = 0,42 * zvE - 8239
Fünfte Zone: zvE ab 250731 €
StB = 0,45 * zvE - 15761 

Eine Python-Funktion zur Berechnung der Einkommenssteuer für 2014 aus dem Einkommentarif sieht nun wie folgt aus: (natürlich ohne Gewähr!!!)

def steuern2014(einkommen):
    """Berechnung der zu zahlenden Steuern im Jahr 2014
    fuer ein zu versteuerndes Einkommen von x"""
    if einkommen < 8354:
        steuer = 0
    elif einkommen <= 13469:
        y = (einkommen - 8004.0)/10000.0
        steuer = (974.58 * y + 1400) * y
    elif einkommen <= 52881:
        z = (einkommen - 13469.0)/10000.0
        steuer = (228.74 * z + 2397.0) * z + 971
    elif einkommen < 250731:
        steuer = einkommen * 0.42 - 8239
    else:
        steuer = einkommen * 0.45 - 15761
    return steuer

Bei Ehegattensplitting lassen sich die Steuern mit folgendem Aufruf berechnen:

steuern = 2 * steuern(einkommen / 2)

Wenn Sie auch 2013 und 2014 Ihre Einkommenssteuer mit Python berechnen wollen, finden Sie hier die die geänderten Funktion zur Steuerberechnung: (Ohne Gewähr)

def steuern2013(einkommen):
    """Berechnung der zu zahlenden Steuern im Jahr 2013
    fuer ein zu versteuerndes Einkommen von x"""
    if einkommen < 8130:
        steuer = 0
    elif einkommen <= 13469:
        y = (einkommen - 8004.0)/10000.0
        steuer = ( 933.70 * y + 1400) * y
    elif einkommen <= 52881:
        z = (einkommen - 13469.0)/10000.0
        steuer = (228.74 * z +2397.0) * z + 1014
    elif einkommen < 250731:
        steuer = einkommen * 0.42 - 8196
    else:
        steuer = einkommen * 0.45 - 15718
    return steuer
def steuern2014(einkommen):
    """Berechnung der zu zahlenden Steuern im Jahr 2014
    fuer ein zu versteuerndes Einkommen von x"""
    if einkommen < 8354:
        steuer = 0
    elif einkommen <= 13469:
        y = (einkommen -8004.0)/10000.0
        steuer = (974.58 * y + 1400) * y
    elif einkommen <= 52881:
        z = (einkommen -13469.0)/10000.0
        steuer = (228.74 * z +2397.0)*z +971
    elif einkommen < 250731:
        steuer = einkommen * 0.42 - 8239
    else:
        steuer = einkommen * 0.45 - 15761
    return steuer

Footnotes

1 Corresponding German legislative text: Einkommensteuergesetz, § 52 Anwendungsvorschriften (41) § 32a Absatz 1 ist ab dem Veranlagungszeitraum 2010 in der folgenden Fassung anzuwenden: "(1) 1Die tarifliche Einkommensteuer bemisst sich nach dem zu versteuernden Einkommen. 2Sie beträgt vorbehaltlich der §§ 32b, 32d, 34, 34a, 34b und 34c jeweils in Euro für zu versteuernde Einkommen 1. bis 8 004 Euro (Grundfreibetrag): 0; 2. von 8 005 Euro bis 13 469 Euro: (912,17 * y + 1 400) * y; 3. von 13 470 Euro bis 52 881 Euro: (228,74 * z + 2 397) * z + 1 038; 4. von 52 882 Euro bis 250 730 Euro: 0,42 * x - 8 172; 5. von 250 731 Euro an: 0,45 * x - 15 694.

An den Formeln zur Berechnung der Einkommenssteuer hat sich im Jahr 2013 nichts prinzipiell geändert. Im folgenden sind die Änderungen in Rot markiert:

  1. bis 8 354 Euro (Grundfreibetrag): 0;
  2. von 8 355 Euro bis 13 469 Euro: (912,17 * y + 1 400) * y;
  3. von 13 470 Euro bis 52 881 Euro: (228,74 * z + 2 397) * z + 1 038;
  4. von 52 882 Euro bis 250 730 Euro: 0,42 * x - 8 239;
  5. von 250 731 Euro an: 0,45 * x - 15 761. 3"y" ist ein Zehntausendstel des 8 004 Euro übersteigenden Teils des auf einen vollen Euro-Betrag abgerundeten zu versteuernden Einkommens. 4"z" ist ein Zehntausendstel des 13 469 Euro übersteigenden Teils des auf einen vollen Euro-Betrag abgerundeten zu versteuernden Einkommens. 5"x" ist das auf einen vollen Euro-Betrag abgerundete zu versteuernde Einkommen. 6Der sich ergebende Steuerbetrag ist auf den nächsten vollen Euro-Betrag abzurunden."