ein freies Lehrmittel auf der Basis von eduskript

Entscheidungsketten: if ... elif ... else

Lernziele
  • Sie verstehen, wie Sie mit if ... elif ... else eine Kette von Bedingungen bilden können.
  • Sie verstehen, wie Bedingungen nacheinander geprüft werden und wie sich elif von mehreren unabhängigen ifs logisch unterscheidet.

Es gibt Fälle, in denen wir mehr als zwei Möglichkeiten haben und mehrere Bedingungen prüfen wollen. Eine elegante Struktur: Mit if ... elif ... else können Sie eine Kette aus mehreren Bedingungen bilden.

Syntax

if Bedingung1:
    # Auszuführende Anweisungen, wenn Bedingung1 True ist
elif Bedingung2:
    # Auszuführende Anweisungen, wenn Bedingung2 True ist (und alle vorherigen Bedingungen False)
elif Bedingung3:
    # Auszuführende Anweisungen, wenn Bedingung3 True ist (und alle vorherigen Bedingungen False)
else:
    # Auszuführende Anweisungen, wenn keine der Bedingungen True ist

Ein essenzielles Detail: Bei if ... elif ... else-Ketten wird jeweils nur die erste wahre Bedingung ausgeführt.

Entdecken: if vs elif

Bevor wir Code schreiben, versuchen Sie das Verhalten des folgenden Snippets vorherzusagen.

zahl = 15

if zahl > 10:
    print("Grösser als 10")
if zahl > 5:
    print("Grösser als 5")

Probieren Sie das Prinzip nun direkt in der Praxis aus:

  1. Führen Sie das Programm unten aus und betrachten Sie den Output. Bei der Zahl 5 tauchen beispielsweise zwei Zeilen auf.
  2. Ändern Sie anschliessend das zweite if in Zeile 5 zu einem elif. Führen Sie das Programm erneut aus. Was ändert sich?
Loading editor...

Was Ihnen auffallen sollte:

  • Wenn Sie zwei unabhängige if-Bedingungen verwenden, werden beide ausgewertet. Ist eine Zahl (z.B. 5) grösser als 4, wird "Grösser als 4" gedruckt. Da sie auch grösser als 2 ist, wird die zweite if-Bedingung ebenfalls erfüllt und "Grösser als 2" wird gedruckt.
  • Mit einer elif-Bedingung verketten Sie die Bedingungen. Wenn die erste Bedingung wahr ist, wird die zweite gar nicht erst geprüft – der gesamte restliche Block wird sofort übersprungen.

Bug-Hunt: Der Altersrabatt

Finde den Fehler

Im folgenden Programm soll ein Ticketpreis anhand des Alters berechnet werden. Allerdings bezahlen momentan auch Babys den vollen Erwachsenen-Preis von 20!Finden Sie heraus, wieso sich der Preis aufbaut, und reparieren Sie die Funktion mit elif (und korrekten Einrückungen), sodass Babys gratis sind, Jugendliche 10 und Erwachsene 20 zahlen. Senioren ab 65 zahlen wieder 15.

Loading editor...

Challenge: Noten berechnen

Auto-Grading: Punkte zu Noten

Schreiben Sie nun eine eigene Funktion noten_berechnen(punkte), die eine Punktzahl erhält und das passende Prädikat als Text zurückgibt:

  • 90 oder mehr Punkte: "A"
  • 80 bis 89 Punkte: "B"
  • 70 bis 79 Punkte: "C"
  • Unter 70 Punkten: "F"

Tipp: Sie müssen nicht mühsam auf Unter- und Obergrenzen gleichzeitig prüfen (nicht if punkte >= 80 and punkte < 90). Beginnen Sie einfach bei der höchsten Punktzahl! Die Reihenfolge übernimmt bei if ... elif ... else die Arbeit für Sie, da vorherige Treffer übersprungen werden.

Loading editor...

Modulo Bingo 2

Damit können wir eine Aufgabe der vorherigen Lektionen erheblich eleganter lösen. Die Aufgabe war: Schreiben Sie ein Programm, das alle Zahlen bis 20 überprüft.

  • Wenn die Zahl nur durch 3 teilbar ist, drucken Sie "Drei" aus
  • Wenn die Zahl nur durch 4 teilbar ist, drucken Sie "Vier" aus
  • Wenn die Zahl sowohl durch 3 als auch durch 4 teilbar ist, drucken Sie "BINGO!" aus
  • Ansonsten drucken Sie die Zahl selbst aus

Die unhandliche Lösung mit einzelnen if-Bedingungen sah so aus:

for i in range(1, 21):
    if i % 3 == 0 and not i % 4 == 0:
        print("Drei")
    if i % 4 == 0 and not i % 3 == 0:
        print("Vier")
    if i % 3 == 0 and i % 4 == 0:
        print("BINGO!")
    if not i % 3 == 0 and not i % 4 == 0:
        print(i)

Eine elegantere Lösung nutzt den Umstand, dass if ... elif ... else-Ketten immer nur die erste Bedingung selektieren, die zutrifft.

Lösung
for i in range(1, 21):
    if i % 3 == 0 and i % 4 == 0:
        print("BINGO!")
    elif i % 3 == 0:
        print("Drei")
    elif i % 4 == 0:
        print("Vier")
    else:
        print(i)

Beachten Sie: Mit elif müssen Sie die Spezialfälle (sowohl 3 als auch 4) zuerst prüfen — sonst würde schon i % 3 == 0 zuschnappen, bevor "BINGO!" je eine Chance hätte. Das ist die Kehrseite der Eleganz: die Reihenfolge der Bedingungen wird Teil der Logik.

Erklärvideo

Zusammenfassung

Zusammenfassung

if ... elif ... else-Kette

Mit elif verketten Sie mehrere Bedingungen — geprüft wird nacheinander, ausgeführt nur die erste, die zutrifft:

if Bedingung1:
    # ausgeführt, wenn B1 True ist
elif Bedingung2:
    # nur ausgeführt, wenn B1 False UND B2 True
else:
    # ausgeführt, wenn keine vorherige zutrifft

Ein optionales else am Ende fängt alle Fälle auf, die keine der vorherigen Bedingungen erfüllt haben.

if vs elif

  • Mehrere ifs nacheinander sind unabhängig — Python prüft jede einzeln, alle können zuschnappen. Brauchen Sie das, wenn die Bedingungen sich nicht gegenseitig ausschliessen.
  • elif-Kette bricht nach dem ersten Treffer ab. Brauchen Sie das, wenn die Fälle sich gegenseitig ausschliessen sollen (z.B. Notenstufen, Altersrabatte, Bingo-Kategorien).

Ein häufiger Bug: Mehrere ifs zu schreiben, wo eine elif-Kette nötig wäre — dann überschreiben sich die Werte. Erkennen Sie das Muster im Bug-Hunt wieder, wo der Babypreis vom Erwachsenenpreis überschrieben wurde.

Reihenfolge zählt

Mit elif wird die Reihenfolge der Bedingungen Teil der Logik. Spezialfälle (z.B. "BINGO!" für beide Teilbar) müssen zuerst stehen, sonst werden sie von einer allgemeineren Bedingung überdeckt. Bei Zahlenbereichen (Noten, Altersgruppen) am einfachsten von der höchsten Stufe abwärts prüfen — dann sparen Sie sich Unter-/Obergrenzen-Kombinationen.