6: If

Bis jetzt haben alle unsere Programme ihre Anweisungen der Reihe nach ausgeführt, ohne irgendwelche Zeilen zu überspringen. Hier ist ein Beispiel; Schritt vor und zurück durch den Code mit den Knöpfen oder den Pfeiltasten auf der Tastatur.

Die neue Möglichkeit in dieser Lektion ist die if-Anweisung, die uns erlaubt, Aktionen nur durchzuführen, wenn bestimmte Bedingungen zutreffen, und ansonsten Zeilen zu überspringen. Ändern wir zum Beispiel unser Programm und geben wir eine extra Nachricht aus, wenn das Alter von einem groß genug ist. Wir werden zwei Zeilen hinzufügen: if age > 65: (bedeutet, "falls age größer als 65") und print('Genieße die Rente!'). Jetzt schrittweise durch den Code:

Beachte, dass die neue print-Aussage übersprungen wurde,weil age nur 31 war! Was passiert mit genau dem selben Programm, wenn birthYear auf 1928 geändert wird?

Siehst du den Unterschied? Die untere Version (mit age 85) gab zwei Zeilen aus und übersprang keine. Dies ist genau die Absicht der if-Anweisung: um etwas zu überprüfen (ist age größer als 65?) und um bestimmte Aktionen durchzuführen (Ausgabe von Genieße die Rente!), nur wenn die Überprüfung als richtig gilt.

Wir nennen die Sache, die überprüft wird, condition, und die Aussagen, die davon abhängig sind, ob die Sache als richtig gilt, body. Der body muss eingerückt sein, was heißt, dass extra Leerzeichen am Anfang der Zeile sind (wie im oberen Beispiel). Der body kann eigentlich mehr als eine Anweisung enthalten: um dies zu tun, schreibe mehrere eingerückte Zeilen. Hier ist ein Beispiel:

  • Versuche, diesen Code in der Konsole oder im Visualisierer mit Geburtsjahr 1982 laufen zu lassen. Beide der eingerückten Zeilen werden übersprungen.

In der nächsten Übung bitten wir dich, ein kurzes Programm mit Boolean-Vergleichen zu schreiben. Im oberen Beispiel sahen wir bereits, dass "if x > y:" "falls x größer als y" bedeutet. Vielleicht findest du auch die folgenden Operationen nützlich:

  • if x < y: heißt "falls x kleiner als y"
  • if x >= y: heißt "falls x größer oder gleich y"
  • if x <= y: heißt "falls x kleiner oder gleich y"

Programmierübung: IHOPython
Schreibe ein Programm, welches einen Integer von input durch pancakes = int(input()) einliest. Falls pancakes mehr als 3 ist, gib Yum! aus und falls pancakes nicht größer als 3 ist, gib stattdessen Still hungry! aus. Hinweis
Du kannst die Eingabe für das Programm in die Box unten eingeben.

Struktur einer if-Anweisung

  • Die erste Zeile,
    if «condition»:
    hat drei Teile: das Wort if, die «condition» (auf Deutsch: Bedingung), welche ein True/False-Ausdruck sein muss (mehr darüber unten), und einen Doppelpunkt :
  • Dann der body bestehend aus einer oder mehreren eingerückten Zeilen. Die Zahl der Leerzeichen (die Größe der Einrückung) ist egal. Ist sie aber uneinheitlich, wird ein Fehler verursacht, da Python die Größe der Einrückung benutzt, um zu bestimmen, wo der body startet und endet.

Der body einer if-Anweisung ist ein Beispiel eines "Blocks". Blöcke werden später an vielen verschiedenen Stellen benutzt, z.B. bei "for-Schleifen" und der Definition eigener Funktionen. (Bestimmte andere Programmiersprachen geben Blöcke durch geschweifte Klammern {} an.)

Die nächste Übung sind eigentlich 4 Übungen in einer. Du wirst die Zeilen eines Programms arrangieren, um mehrere verschiedene Ergebnisse zu erhalten.
Klicke auf die horizontalen Rahmen, um jeden Teil zu öffnen; du kannst das in beliebiger Reihenfolge machen. Wie gewöhnlich, pack und lass die Zeilen los (drag and drop), um sie neu zu arrangieren.


Teil 1: Unerwartete Einrückung
Sortierübung: Unerwartete Einrückung
Du musst den folgenden Fehler verursachen:

IndentationError: unexpected indent
  • if 1000 < 10:
  • print("message 1")
  • print("message 2")
  • if 2 > 1:
  • print("message 3")
Teil 2: Unerwartete Ausrückung
Sortierübung: Unerwartete Ausrückung
Du musst den folgenden Fehler verursachen:

IndentationError: unindent does not match any outer indentation level
  • if 1000 < 10:
  • print("message 2")
  • if 2 > 1:
  • print("message 3")
  • print("message 1")
Teil 3: Einrückung erwartet, aber nicht gefunden
Sortierübung: Erwartete Einrückung
Du musst den folgenden Fehler verursachen:

IndentationError: expected an indented block
  • if 1000 < 10:
  • print("message 1")
  • print("message 2")
  • if 2 > 1:
  • print("message 3")
Teil 4: Ordentliche Einrückung
Sortierübung: Ordentliche Einrückung
Verursache keine Fehler!
  • if 1000 < 10:
  • print("message 1")
  • print("message 2")
  • if 2 > 1:
  • print("message 3")

True, False, und bool

So weit sahen wir im «condition»-Teil einer if-Aussage einen einfachen numerischen Vergleich x > y, der wahr ist, wenn x größer als y, und falsch, wenn x kleiner oder gleich y. Allgemein werden Ausdrücke, deren Wert entweder wahr oder falsch ist, Boolean genannt (siehe George Boole; auf Deutsch sagt man auch "boolesch"). In Python wird der bool-Typ benutzt, um Werte von Boolean-Ausdrücken zu repräsentieren. Für diesen Typ existieren nur zwei Werte: True und False.

Beispiel
Boolean expressions

Beachte, dass wenn du in Python die bool-Werte True und False direkt in einem Programm benutzt,
sie mit einem Großbuchstaben anfangen müssen oder du bekommst eine Fehlermeldung.

Boolean-Vergleiche

Die Operatoren >, <, <=, und >= vergleichen zwei Zahlen und geben einen bool zurück. Hier sind zwei andere Wege um Zahlen zu vergleichen:

  • x == y ist der Gleichheitsoperator, er gibt True zurück, falls x und y gleich sind
  • x != y ist der Ungleichoperator, er gibt True zurück, falls x and y ungleich sind
  • == und != funktionieren auch bei strings und anderen Typen von Daten

(Hier sind zwei Gleichheitszeichen ==, denn das (nur) eine hat bei x = «expression» die Bedeutung "weise der Variable x den Wert von «expression» zu". Die Verwechslung von = mit == ist eine allgemeine Quelle der Bugs.)

Hier ist eine Übung, die eine der neuen Vergleiche beinhalten wird.

Programmierübung: What's Your Sign?
Schreibe ein Programm, das einen Integer von input einliest, dann eine der Wörter (mit Großbuchstaben) Positive, Negative, oder Zero ausgibt, entsprechend dem, ob die Nummer positiv, negativ oder Null ist.
Du kannst die Eingabe für das Programm in die Box unten eingeben.

Wir haben gerade das Konzept eines Blocks eingeführt (mehrere zusammengruppierte Zeilen mit dem gleichen Faktor an Einrückung).
Du kannst einen Block in einem anderen haben:

if password=='openSesame':
  print('User logged on.')
  if hour>17:
    print('Good evening!')
  print('Enter a command:')
Hier besteht der äußere Block aus 4 Zeilen und der innere Block aus nur einer Zeile:
if password=='openSesame':  
print('User logged on.')
if hour>17:
print('Good evening!')
print('Enter a command:')

Multiple-Choice-Übung: Verschachtelte ifs
Welche der folgenden Ausgaben ist nicht möglich für dieses Programm?
Richtig! Falls irgendwelche Nachrichten gezeigt werden, muss es der Fall sein, dass der äußere (blaue) Block ausgeführt wurde, oder in anderen Worten das Passwort korrekt war. In diesem Fall, selbst wenn hour>17 false ist (und der innere Block übersprungen wird), wird die Zeile print('Enter a command:') des äußeren Blocks stets ausgeführt.

Jetzt musst du verschachtelte Blöcke verwenden, um einen etwas komplexeren Altersrechner zu programmieren.

Programmierübung: Altersüberprüfer
Schreibe ein Programm, das einen Integer von input einliest, der jemandes Alter repräsentiert. Ist das Alter 18 oder größer, gib You can vote aus. Ist das Alter 0 bis 17 inklusive, gib Too young to vote aus. Ist das Alter kleiner als 0, gib You are a time traveller aus.
Du kannst die Eingabe für das Programm in die Box unten eingeben.

Später werden wir in Lektion 9 sehen, dass Situationen mit mehreren Boolean-Überprüfungen vereinfacht werden können, und zwar durch den else and elif (else if)-Befehl, sowie mit den Boolean-Operatoren "and", "or" und "not". Im Moment bist du bereit für die nächste Lektion.