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.

In dem abschließenden Beispiel dieses Kapitels geht es um Steuern. Wir schreiben ein Pythonskript, mit dem man sich aus dem zu versteuernden Einkommen die Steuern für 2014 berechnen lassen kann.

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, dass wenn hier "French" eingegeben wird, nichts passiert. Die Prüfung in der Bedingung ist nämlich case-sensitiv und reagiert in diesem Fall nur, wenn "french" eingegeben wird. Wir erweitern nun die Bedingung mit einem "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. Dass 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 dem 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 "Funtionen" aufgreifen, um daraus eine Funktion zu machen.

Wahr oder falsch

"Was nicht verboten ist, ist erlaubt" so funktioniert unser Gesetz. Dadurch soll vermieden werden, dass es Lücken im Gesetz gibt. Ähnlich verhält es sich auch mit den Bedingungen in Python. Alles was nicht False ist, hat den Wert True. Wir brauchen also nur zu definieren, was "falsch", also False ist. Als "falsch" gilt in Python:

numerische Null-Werte(0, 0L, 0.0, 0.0+0.0j),
der boolschen Wert False,
leere Zeichenketten,
leere Listen, leere Tupel,
leere Dictionaries.
sowie der spezielle Wert None. 

Alle anderen Werte betrachtet Python als "wahr".

Damit erklären sich auch Bedingungen, die nur aus einem Variablennamen bestehen. So wie beispielsweise im folgenden Beispielprogramm in der Bedingung der while-Schleife:

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."