8    Bedingungen – Was passiert, wenn …

Bisher haben wir immer lineare Programmabläufe geschrieben, das heißt, Programme, die Zeile für Zeile von oben nach unten komplett durchlaufen wurden. Nun kommt etwas zusätzliche Struktur hinein. Python kann auch auf Bedingungen reagieren und je nach Ergebnis nur bestimmte Befehle ausführen oder Befehle überspringen.

Wir haben gelernt, dass ein Programm eine Folge von Befehlen ist, die nacheinander durchlaufen werden. Am Anfang werden zum Beispiel Daten eingegeben, dann wird die Berechnung der Daten durchgeführt, und dann wird am Schluss das Ergebnis ausgegeben. Das ist auch ganz richtig so – aber es ist noch nicht alles. In diesem und den nächsten Kapiteln werden wir feststellen, dass Programme auch Strukturen enthalten können.

Was heißt das?

Das heißt zunächst einmal, dass Teile von Programmen vielleicht nur unter bestimmten Bedingungen ausgeführt werden, wenn sie wirklich gebraucht werden. Oder dass Berechnungen unterschiedlich verlaufen, je nachdem, welche Daten eingegeben worden sind.

Nehmen wir ein Beispiel: Du möchtest ermitteln, wie lange du brauchst, um von Punkt A nach Punkt B zu kommen. Du sagst dem Programm, wie viele Kilometer die Strecke lang ist und ob du zu Fuß oder mit dem Fahrrad unterwegs bist.

Je nachdem, ob du läufst oder mit dem Fahrrad unterwegs bist, muss Python natürlich anders berechnen, wie lange es dauert, denn schließlich sind Radfahrer schneller unterwegs als Fußgänger.

Python muss also zwei unterschiedliche Fälle unterscheiden und je nach Fall bzw. Bedingung eine andere Berechnung durchführen.

Die Unterscheidung von unterschiedlichen Fällen ist eine Programmstruktur, die man auch if-Struktur nennt (falls – dann).

Was das Programm also machen muss:

Falls zu Fuß unterwegs, dann: 
Berechne Zeit = km / 5 Stunden.
Falls mit dem Fahrrad unterwegs:
Berechne Zeit = km / 15 Stunden.

(Wenn du ein sehr schneller Radfahrer oder Fußgänger bist, kannst du auch gern höhere Werte verwenden).

Wie fragen wir nun solche Bedingungen ab und unterscheiden unterschiedliche Fälle in Python?

»if«-Abfragen in Python

Beginnen wir damit, die Daten einzugeben. Zunächst die Streckenlänge, die wir in der Variable km speichern, dann das Verkehrsmittel (vm) – entweder 1 für zu Fuß oder 2 für Fahrrad.

km = input("Wie lang ist die Strecke in km?")
vm = input("Zu Fuß (1) oder Fahrrad (2)?")

Nun muss Python unterscheiden: Wenn vm gleich 1 ist (zu Fuß), dann wird die Dauer für 5 km/h berechnet, wenn vm gleich 2 ist, dann wird die Dauer für 15 km/h berechnet.

Für die Unterscheidung gibt es in Python den if-Befehl. Fragen wir zuerst den Fall 1 ab:

if vm == 1:

Hier fallen zwei Dinge auf. Erstens werden zwei Gleichheitszeichen hintereinander verwendet, und zweitens steht am Ende ein Doppelpunkt,

Warum zwei Gleichheitszeichen?

Das liegt daran, dass ein einfaches Gleichheitszeichen in Python schon anders belegt ist und eine Zuweisung bedeutet. a = 5 schreibt den Wert 5 in die Variable a und vergleicht nicht a mit 5.

Wenn ich aber zwei Werte vergleichen möchte, dann muss ich es in Python anders kennzeichnen. Dafür werden zwei Gleichheitszeichen verwendet.

[ ! ]  Achtung: »==«

Wenn du zwei Werte im if-Befehl auf Gleichheit prüfst, musst du immer das doppelte Gleichheitszeichen verwenden!

Das zweite Zeichen, das auffällt, ist der Doppelpunkt. Er weist darauf hin, dass die nächste Zeile (oder auch die nächsten Zeilen) ebenfalls zu diesem Befehl gehören. Ein if-Befehl steht nämlich nie allein, sondern ihm folgt stets das, was ausgeführt werden soll, wenn die Bedingung erfüllt ist.

Wenn du die Zeile

if vm == 1:

im Programmfenster eingibst und die (¢)-Taste drückst, dann ist die nächste Zeile automatisch nach rechts eingerückt. Damit wird gekennzeichnet, dass sie zum if-Befehl gehört.

Das Ganze sieht dann nach Eingabe so aus:

if vm == 1:
stunden = km / 5

Das bedeutet: Falls das Verkehrsmittel 1 ist (zu Fuß) dann berechne die Zeit mit km / 5.

Die nach rechts eingerückte Zeile ist die bedingte Zeile. Sie wird nur dann ausgeführt, wenn die davorstehende if-Bedingung wahr ist. Ansonsten wird alles, was nach der if-Anweisung eingerückt ist, komplett übersprungen.

Wenn du nach der eingerückten Zeile wieder die (¢)-Taste drückst, ist die nächste Zeile erneut eingerückt. Du könntest also jetzt noch mehr Befehle schreiben, die auch alle nur dann ausgeführt werden, wenn die Bedingung vm == 1 wahr ist.

Wenn du aber fertig bist und die if-Abfrage beendet ist, drückst du einmal die (_í)-Taste (Rückschritttaste), und der Zeilenanfang wandert wieder nach ganz links. Jetzt ist der if-Befehl beendet, und das Programm geht von hier an wieder normal weiter.

[ ! ]  Achtung: Einrückung

Der Programmteil, der fest zu einer Bedingung gehört und nur ausgeführt wird, wenn die Bedingung wahr ist, wird in Python immer als Block nach rechts eingerückt. Das ist eine Besonderheit von Python. Du musst darauf achten, dass die Zeilen, die zu einem gemeinsamen Block gehören, immer gleich weit eingerückt sind, sonst gibt Python einen Fehler aus.

Anschließend kann die zweite Abfrage kommen. Wenn mit dem Fahrrad unterwegs, dann rechne mit 15 km/h. Oder in Python:

Und auch danach gehst du mit der (_í)-Taste wieder nach links zurück und setzt die Eingabe des Programms fort.

Jetzt ist die Variable zeit berechnet, und es kommt der Ausgabebefehl, ganz normal:

print "Es dauert",stunden,"Stunden."

Im Ganzen sieht das Programm jetzt folgendermaßen aus:

Durch die Einrückungen sieht man deutlich, welche Befehle nur unter einer Bedingung ausgeführt werden und wo es weitergeht, falls die Bedingung nicht zutrifft. Das ist das Schöne an Python – die Programme sind mit dieser Struktur immer sehr übersichtlich und leicht zu durchschauen.

Probiere es aus mit verschiedenen Werten und Verkehrsmitteln.

Dabei könntest du schnell auf ein Problem stoßen: Was ist, wenn du weder 1 noch 2 eingibst? Zum Beispiel 0 oder 3 oder »xy« oder gar nichts?

Dann gibt es einen Fehler mit Programmabbruch.

Der Name 'stunden' ist nicht definiert oder falsch geschrieben.

Es existiert also keine Variable oder Funktion mit diesem Namen.

Ganz klar: Wenn vm nicht 1 ist und vm auch nicht 2 ist, dann wird keine der beiden Berechnungen ausgeführt, sie werden beide übersprungen, und die Variable stunden wird dadurch gar nicht erst mit einem Wert belegt. Die Variable stunden existiert dann gar nicht. Also gibt es einen Fehler, denn eine Variable, die nicht existiert, kann man auch nicht ausgeben.

Was kann man dagegen tun?

Du kannst ja schlecht jede nur erdenkliche Zahl oder sonstige Eingabe abfragen. Wer weiß schon, was ein Benutzer alles eingeben kann … Stattdessen müsstest du eine Möglichkeit haben, zu prüfen, ob »etwas anderes« eingegeben wurde als das, was du abgefragt hast.