Python-Kurs / Mit if, elif und else eindeutige Zweige auswählen

Eine Kette aus if, elif und else prüft Bedingungen von oben nach unten und führt nur den ersten passenden Zweig aus. Planen Sie deshalb zuerst Reihenfolge und Grenzen Ihrer Fälle, bevor Sie die Bedingungen schreiben.

Zweige mit Einrückung abgrenzen

Hinter einer Bedingung steht ein Doppelpunkt. Die zugehörigen Anweisungen werden gleichmäßig eingerückt, üblicherweise mit vier Leerzeichen. elif und else stehen auf derselben Einrückungsebene wie das zugehörige if. Hinter else steht keine weitere Bedingung.

Mischen Sie Tabs und Leerzeichen nicht. Ein optisch ähnlich ausgerichteter Text kann vom Interpreter anders verstanden werden oder einen Einrückungsfehler auslösen. Stellen Sie im Editor eine einheitliche Einrückung ein und prüfen Sie, welche Zeilen tatsächlich zum selben Zweig gehören.

Zwei getrennte if-Anweisungen prüfen zwei unabhängige Regeln; beide können ausgeführt werden. Eine if/elif-Kette wählt dagegen höchstens einen Zweig. Für ausschließliche Größenklassen eignet sich eine Kette. Für zwei unabhängige Warnungen, etwa „Betrag hoch“ und „Kategorie fehlt“, können zwei getrennte Prüfungen beabsichtigt sein.

Die offizielle Einführung zu if-Anweisungen beschreibt Aufbau und Bedeutung. Die Übung zu Vergleichen und logischen Operatoren erklärt, wie Sie die Bedingungen formulieren.

Eine vollständige Betragsklassifizierung ausführen

Speichern Sie den gesamten folgenden Code als classify.py in UTF-8 im Übungsordner. Starten Sie python classify.py mit Ihrem Projektinterpreter; unter macOS oder Ubuntu kann außerhalb einer aktivierten Umgebung python3 der passende Befehl sein. Zusatzpakete und Eingabedateien sind nicht erforderlich.

amount = 8000
if amount < 0:
    label = "invalid"
elif amount == 0:
    label = "free"
elif amount <= 10000:
    label = "small"
else:
    label = "large"
print(label)

Erwartete Ausgabe:

small

8000 ist weder negativ noch null. Die dritte Prüfung amount <= 10000 ist wahr; daher erhält label den Text small. Der abschließende print-Aufruf steht außerhalb der Kette und zeigt das gewählte Ergebnis.

Die Texte im Beispiel bezeichnen die Klassen: invalid bedeutet ungültig, free steht hier für Betrag null, small für die kleine und large für die große Betragsklasse. Diese Namen und Grenzen sind Regeln dieses Beispiels, keine allgemeine Einteilung für alle Anwendungen.

Bereiche und Reihenfolge der Bedingungen festlegen

Testwert Erwartetes label Begründung
-1 invalid Negativer Betrag
0 free Genau null
1 und 10000 small Positiver Betrag bis einschließlich 10000
10001 large Größer als 10000

Die Beschreibung 1 bis 10000 setzt ganze Beträge voraus. Das Beispiel validiert den Typ selbst nicht: Ein positiver float wie 0.5 würde ebenfalls den small-Zweig erreichen. Wenn die Anwendung ausschließlich ganze Beträge verlangt, prüfen Sie diese Voraussetzung zusätzlich.

Frühere Bedingungen schließen Fälle für spätere Zweige aus. Daher muss die dritte Bedingung nicht noch einmal ausdrücklich Positivität prüfen. Würden Sie die breite Bedingung amount <= 10000 an den Anfang stellen, würden auch negative Werte und null dort landen; spätere spezielle Zweige könnten diese Fälle nicht mehr erreichen.

Ein Benutzertext ist vor dieser Klassifizierung passend umzuwandeln und zu prüfen. Die Eingabe-und-Ausgabe-Übung zeigt den Übergang von Text zu Zahl. Eine fehlgeschlagene int-Umwandlung ist ein anderer Fehler als eine fachlich negative Zahl. Trennen Sie beide Entscheidungen.

Alle Pfade und veränderte Grenzen überprüfen

  1. Ersetzen Sie nur den Anfangswert amount nacheinander durch -1, 0, 1, 10000 und 10001. Prüfen Sie die Ausgaben anhand der Tabelle.
  2. Verwenden Sie 10000 und ändern Sie ausschließlich elif amount <= 10000: zu elif amount < 10000:. Die Ausgabe muss zu large wechseln. Stellen Sie den Operator wieder auf <= zurück.
  3. Stellen Sie den ursprünglichen Anfangswert 8000 wieder her und bestätigen Sie small.
  4. Prüfen Sie bei zwei unabhängigen Warnungen, ob tatsächlich beide erscheinen dürfen. Bilden die Regeln hingegen eine einzige Klassifizierung, verwenden Sie eine passende Kette und prüfen Sie auch die Reihenfolge.

Ein nach der Kette verwendeter Name muss auf jedem erreichbaren Pfad einen Wert erhalten. Im Beispiel weist jeder Zweig label zu. Wenn Sie dagegen nur bei wahrer Bedingung result setzen und es danach ausgeben, kann ein anderer Eingangspfad auf einen undefinierten Namen zugreifen.

Auf Modulebene kann dabei NameError entstehen. Innerhalb einer Funktion gilt ein dort zugewiesener Name normalerweise als lokal; ein Lesen vor der tatsächlich erfolgten Zuweisung kann UnboundLocalError auslösen. Setzen Sie einen sinnvollen Ausgangswert oder weisen Sie den Wert in allen erforderlichen Zweigen zu. Die Sprachreferenz zur Namensauflösung beschreibt den Zusammenhang.

Ein leeres Ergebnis oder unerreichter Zweig sollte zuerst zur Prüfung von Eingabe, Bedingung und früheren Treffern führen. Zusätzliche Verschachtelung löst eine falsche Reihenfolge nicht. Beispiele direkt an den Grenzen sind für diese Diagnose hilfreicher als viele Wiederholungen mit demselben mittleren Wert.