Zum Inhalt
wannacode

Bedingungen

Kurz gesagt: Mit einer Bedingung wählt das Programm aus, was es tut: if führt einen Block nur aus, wenn der Vergleich wahr ist, elif und else geben die anderen Wege vor, und match wählt zwischen vielen Werten.

Problem

Die Lieferung, die es nicht geben sollte

Ein Onlineshop verspricht kostenlose Lieferung für Bestellungen ab 50 €. Unter 50 € kostet die Lieferung 4,99 €. Die Bestellung liegt bei 62 €, und das Programm rechnet trotzdem die Lieferung dazu:

total = 62.0
shipping = 4.99
print(f"Zu zahlen: {total + shipping} €")
Ausgabe
Zu zahlen: 66.99 €

Das Programm führt jede Zeile aus, eine nach der anderen. Hier muss es aber auswählen: in einem Fall die eine Zeile, im anderen Fall eine andere.

Die Idee

Ein Vergleich antwortet mit ja oder nein

Zuerst muss das Programm fragen: Ist die Summe 50 € oder mehr? Dafür gibt es Vergleichsoperatoren. Ihre Antwort ist keine Zahl, sondern True (wahr) oder False (falsch): ein Wert vom Typ bool.

total = 62.0
print(total >= 50)
print(total == 50)
print(total != 50)
Ausgabe
True
False
True
Du schreibst Es fragt
a > b, a < b größer, kleiner
a >= b, a <= b größer oder gleich, kleiner oder gleich
a == b sind sie gleich
a != b sind sie verschieden

Pass auf: == vergleicht, und = speichert einen Wert. total == 50 fragt, ob die Summe 50 ist, und total = 50 setzt sie auf 50.

Text wird in Python mit demselben == verglichen:

answer = "ja"
yes = answer == "ja"
print(yes)
Ausgabe
True
Genauer, für Neugierige

Kommazahlen sind selten genau gleich. Der Computer speichert 0.1 und 0.2 nur ungefähr, deshalb ist ihre Summe nicht genau 0.3:

print(0.1 + 0.2 == 0.3)
print(0.1 + 0.2)
Ausgabe
False
0.30000000000000004

Bei Kommazahlen fragst du besser, ob sie nah genug beieinander liegen: abs(a - b) < 0.000001. Vergleiche mit > und < haben dieses Problem nicht.

Die Idee

if und else: einer von zwei Wegen

Jetzt kann das Programm auswählen. if prüft die Bedingung dahinter. Ist sie wahr, führt es den Block nach dem Doppelpunkt aus. Ist sie es nicht, führt es den Block nach else: aus. Der Block sind die Zeilen, die um 4 Leerzeichen eingerückt sind. Es gibt keine geschweiften Klammern: Die Einrückung zeigt, was drinnen ist.

total = 62.0
if total >= 50:
shipping = 0
else:
shipping = 4.99
print(f"Lieferung: {shipping} €")
Ausgabe
Lieferung: 0 €

Bei einer Bestellung von 18,50 € gibt dasselbe Programm Lieferung: 4.99 € aus. Es wird nur einer der Blöcke ausgeführt, nie beide.

else ist nicht Pflicht. Ohne else wird der Block übersprungen, wenn die Bedingung nicht wahr ist, und das Programm macht danach weiter.

Genauer, für Neugierige
  • In Python ist die Einrückung nicht zur Zierde da, sie gehört zum Code. Eine Zeile, die genauso weit eingerückt ist wie das if selbst, steht schon außerhalb des Blocks und wird immer ausgeführt.
  • Die Bedingung kann jeder Wert sein, nicht nur True oder False. Die Zahl 0 und der leere Text "" zählen als falsch, alles andere als wahr:
total = 0
if total:
print("Es gibt eine Summe")
else:
print("0 zählt als falsch")
Ausgabe
0 zählt als falsch
  • if total = 50: stoppt schon, bevor das Programm startet, mit SyntaxError: Python erlaubt = in einer Bedingung nicht.

Probier es aus

Eine Bestellung über dem Lagerbestand

Im Lager sind 3 Stück, und der Kunde bestellt 5.

Was gibt das Programm aus?

stock = 3
ordered = 5
if ordered > stock:
print("Nicht genug auf Lager")
ordered = stock
print(f"Wir versenden {ordered} Stück")
Antwort

Die Idee

elif: mehr als zwei Wege

Eine Lehrerin macht aus den Punkten eines Tests eine Note. Es gibt vier Möglichkeiten. Zwischen if und else setzt du elif (kurz für else if, „sonst wenn“):

points = 76
if points >= 90:
print("Ausgezeichnet")
elif points >= 75:
print("Sehr gut")
elif points >= 50:
print("Gut")
else:
print("Ungenügend")
Ausgabe
Sehr gut

Die Prüfungen laufen von oben nach unten. Ausgeführt wird der erste Zweig mit einer wahren Bedingung, die anderen werden übersprungen. 76 ist nicht >= 90, aber >= 75, also ist es „Sehr gut“. Bis zu >= 50 kommt das Programm nie, obwohl auch das wahr ist.

Deshalb ist die Reihenfolge wichtig: Die strengste Bedingung kommt zuerst. Stünde points >= 50 ganz oben, bekäme jeder mit 50 Punkten oder mehr „Gut“.

points = 76
if points >= 90:
print("Ausgezeichnet")
elif points >= 75:
print("Sehr gut")
elif points >= 50:
print("Gut")
else:
print("Ungenügend")
Schritt für Schritt, in Worten
  1. points ist 76.
  2. 76 >= 90? Nein. Der Zweig „Ausgezeichnet“ wird übersprungen.
  3. 76 >= 75? Ja. Wir gehen in den Zweig „Sehr gut“.
  4. Ausgegeben wird „Sehr gut“.
  5. Auch 76 >= 50 ist wahr, wird aber nicht geprüft. Die Kette endet beim ersten wahren Zweig.

Probier es aus

Finde den Fehler

Jeder mit 90 Punkten oder mehr bekommt „Ausgezeichnet“. Ein Schüler mit genau 90 Punkten bekommt „Sehr gut“. In welcher Zeile ist der Fehler?

Wähle die Zeile mit dem Fehler.

Die Idee

Und, oder, nicht

Das Kino gibt Kindern und Studierenden ein ermäßigtes Ticket. Es gibt zwei Bedingungen, und eine reicht. Du verbindest sie mit logischen Operatoren:

age = 16
student = False
if age < 18 or student:
print("Ermäßigtes Ticket: 6 €")
else:
print("Ticket: 10 €")
Ausgabe
Ermäßigtes Ticket: 6 €

In Python sind die Operatoren Wörter:

  • a and b ist wahr, wenn beide wahr sind („und“).
  • a or b ist wahr, wenn mindestens eine wahr ist („oder“).
  • not a ist wahr, wenn a nicht wahr ist („nicht“): not student.

Kostenlose Lieferung ab 50 € und nur in der Stadt ist total >= 50 and in_city. Eine Zahl liegt zwischen 1 und 12, wenn month >= 1 and month <= 12. In Python funktioniert auch die Schreibweise aus der Mathematik, 1 <= month <= 12: Sie bedeutet dasselbe.

month = 13
print(1 <= month <= 12)
print(month >= 1 and month <= 12)
Ausgabe
False
False
Genauer, für Neugierige
  • Wenn der linke Operand die Antwort schon entscheidet, wird der rechte nicht geprüft: bei False and … und bei True or …. Das heißt Kurzschlussauswertung und schützt manchmal vor einem Fehler: count != 0 and total / count > 10 teilt nie durch 0 (in Python stoppt eine Division durch 0 das Programm mit ZeroDivisionError).
  • and kommt vor or, so wie * vor +. Wenn du sie mischst, setz Klammern, damit es klar lesbar ist: (a and b) or c.
  • Eine Bedingung kann auch in einem anderen if stehen. Das ist ein verschachteltes if. Dieser Code ist dasselbe wie if total >= 50 and in_city:
if total >= 50:
if in_city:
shipping = 0

Probier es aus

Durch 5 und durch 7

Was gehört in die Lücke, damit die Bedingung nur für Zahlen wahr ist, die sowohl durch 5 als auch durch 7 teilbar sind?

number = 35
if number % 5 == 0  number % 7 == 0:
    print("Durch 5 und durch 7 teilbar")

Die Idee

Der bedingte Ausdruck if … else

Manchmal ist das ganze if nur dazu da, einen von zwei Werten auszuwählen. Dafür gibt es eine Kurzform in einer Zeile, den bedingten Ausdruck:

points = 76
message = "Du hast bestanden!" if points >= 50 else "Leider nicht bestanden."
print(message)
Ausgabe
Du hast bestanden!

Er liest sich fast wie ein Satz: Wert, wenn wahr, if Bedingung, else Wert, wenn nicht. Dasselbe mit if und else braucht mehrere Zeilen, hier ist es eine.

In Java, C# und JavaScript schreibt man dasselbe mit ? : und nennt es ternären Operator. Python hat kein ? :. Die Entsprechung ist der bedingte Ausdruck.

Nimm ihn, um einen Wert auszuwählen. Wenn das Programm in den beiden Fällen verschiedene Dinge tun soll, schreib if.

Genauer, für Neugierige
  • Die beiden Werte können verschiedene Typen haben: im einen Fall Text, im anderen eine Zahl. Das Programm läuft, aber danach weißt du nicht, was in der Variable steckt. Wähle zwischen Werten desselben Typs.
points = 40
result = "Bestanden" if points >= 50 else 0
print(result)
Ausgabe
0
  • Bedingte Ausdrücke lassen sich ineinander verschachteln, aber solcher Code ist schwer zu lesen. Für drei oder mehr Möglichkeiten schreib elif.

Die Idee

match: Auswahl nach Wert

Der Shop hat werktags von 9:00 bis 18:00 geöffnet, am Samstag bis 14:00, und am Sonntag ist er geschlossen. Wenn der Tag eine Zahl ist (1 ist Montag, 7 ist Sonntag), vergleichst du sie mit mehreren genauen Werten. Dafür gibt es match:

day = 6
match day:
case 6:
print("10:00–14:00")
case 7:
print("Geschlossen")
case _:
print("9:00–18:00")
Ausgabe
10:00–14:00
  • match nimmt den Wert dahinter und vergleicht ihn von oben nach unten mit jedem case. Ausgeführt wird der erste, der passt.
  • Nach seinem case ist match fertig: Die anderen werden nicht ausgeführt, und du brauchst kein break.
  • case _: ist für alle anderen Werte da, wie das letzte else.
  • Mehrere Werte mit derselben Aktion schreibst du mit | in ein case: case 6 | 7:.

match gibt es in Python seit 3.10. In älterem Code schreibt man dasselbe mit if und elif. Für Prüfungen wie „ab 50 aufwärts“ schreib if.

Genauer, für Neugierige
  • Ein case mit einem bloßen Namen, zum Beispiel case sunday:, vergleicht nicht mit der Variable sunday. Er passt auf jeden Wert und speichert ihn unter diesem Namen. Hier ist der Tag 3, und das Programm gibt „Geschlossen“ aus:
sunday = 7
day = 3
match day:
case sunday:
print("Geschlossen")
Ausgabe
Geschlossen

Schreib in einen case die Zahlen und den Text selbst: case 7:, case "+":.

  • In Java und C# kann switch auch einen Wert liefern. match kann das nicht: Speichere den Wert in jedem case in einer Variable. Ein Beispiel mit |:
day = 7
match day:
case 6 | 7:
print("Wochenende")
case _:
print("9:00–18:00")
Ausgabe
Wochenende

Übung

Programme, die auswählen

Löse die Aufgaben in deinem Editor. Jede Zahl der Eingabe steht in einer eigenen Zeile. Probier jede Lösung auch mit einer Eingabe aus, die durch die anderen Zweige läuft.

1. Eine Kinokarte. Lies das Alter ein. Bis 6 Jahre ist der Eintritt frei, bis 17 kostet das Ticket 6 €, bis 64 kostet es 10 €, ab 65 kostet es 5 €. Ein negatives Alter ist ein Fehler.

Eingabe
15
Ausgabe
Das Ticket kostet 6 €

2. Ein Mini-Taschenrechner. Lies eine Zahl, eine Operation (+, -, * oder /) und eine zweite Zahl ein. Wähle die Rechnung mit match nach dem Text der Operation aus. Durch 0 darf nicht geteilt werden.

Eingabe
12
/
5
Ausgabe
Ergebnis: 2.4

3. Eine quadratische Gleichung. Lies a, b und c aus ax² + bx + c = 0 ein. Die Diskriminante ist D = b² − 4ac. Ist D positiv, gibt es zwei Lösungen: (−b ± √D) / 2a. Ist D gleich 0, gibt es eine Lösung: −b / 2a. Ist D negativ, gibt es keine reellen Lösungen. Ist a = 0, ist die Gleichung nicht quadratisch.

Eingabe
1
-3
2
Ausgabe
x1 = 2.00, x2 = 1.00

4. Ein gültiges Datum. Lies einen Tag, einen Monat und ein Jahr ein und sag, ob es das Datum gibt. Die Anzahl der Tage im Monat findest du mit match heraus. Der Februar hat in einem Schaltjahr 29 Tage: Das Jahr ist durch 4 teilbar, aber nicht durch 100, oder es ist durch 400 teilbar.

Eingabe
29
2
2023
Ausgabe
Ungültiges Datum

Für 29, 2, 2024 lautet die Ausgabe Gültiges Datum.

Weitere Aufgaben

  • Gerade oder ungerade. Für 7: Ungerade.
  • Positiv, negativ oder null. Für −5: Negativ.
  • Größer als 10. Für 15: Größer als 10.
  • Sind sie gleich. Lies zwei Zahlen ein. Für 5 und 5: Gleich.
  • Die größere von zwei. Lies zwei Zahlen ein und gib die größere aus. Mach es einmal mit if und einmal mit … if … else ….
  • Betrag. Ohne abs: Wenn die Zahl negativ ist, kehr ihr Vorzeichen um.
  • Ja oder nein. Lies einen Text ein. Gib True für „ja“ aus, False für „nein“ und Antwort nicht verstanden für alles andere.
  • Durch 5 und durch 7. Sag, ob die Zahl sowohl durch 5 als auch durch 7 teilbar ist. Für 35: ja, für 10: nein.
  • Drei Zahlen aufsteigend. Lies drei Zahlen ein und gib sie von der kleinsten bis zur größten aus. Für 7, 2, 5: 2 5 7.
  • Die kleinste und die größte von fünf. Lies fünf Zahlen in fünf Variablen ein. Merk dir die erste als kleinste und als größte und vergleiche dann jede weitere damit.
  • Wochentag. Lies eine Zahl von 1 bis 7 ein und gib den Tag aus: 1 ist Montag. Für eine andere Zahl: Diesen Tag gibt es nicht. Probier es mit match.
  • Altersgruppe. Bis 12 Jahre ist man ein Kind, bis 19 ein Teenager, sonst erwachsen.
  • Jahreszeit nach Monat. Dezember, Januar und Februar sind Winter, März bis Mai ist Frühling und so weiter. Für 4: Frühling. Mit match schreibst du mehrere Werte in ein case: case 12 | 1 | 2:
  • Ist es ein Dreieck. Drei Seiten bilden ein Dreieck, wenn die Summe von je zwei größer ist als die dritte. Für 3, 4, 5: ja, für 1, 2, 3: nein.
  • Eine Note in Worten. Lies eine Note von 2 bis 6 ein und gib Ungenügend, Ausreichend, Gut, Sehr gut oder Ausgezeichnet aus.
  • Errate das Tier. Das Programm stellt Fragen, die man mit „ja“ oder „nein“ beantwortet, und errät, an welches Tier du denkst. Beginne mit einer Begrüßung und einer kurzen Erklärung des Spiels. Du kannst alle Fragen stellen und dann mit elif entscheiden, oder du fragst mit verschachtelten if nur, was du brauchst. Die Fragen:
Frage Bei „ja“ Bei „nein“
Fliegt es? ein Vogel oder ein Insekt weiter
Hat es Federn? ein Vogel wenn es fliegt, ein Insekt
Schwimmt es? wenn es nicht fliegt: ein Fisch oder ein kleines Wassersäugetier weiter
Miaut es? eine Katze keine Katze
Hat es Fell? ein Hund, eine Katze oder ein anderes Säugetier eine Eidechse oder ein anderes Reptil
Ist es grün? wenn es weder fliegt noch schwimmt: ein Frosch oder eine Eidechse weiter
Brüllt es? eine Kuh oder ein Löwe weiter
Hat es einen Rüssel? ein Elefant weiter

Ein Beispiel (die Eingabe ist die Antwort auf jede Frage, der Reihe nach):

Eingabe
nein
nein
nein
ja
ja
nein
nein
nein
Ausgabe
Denk dir ein Tier aus. Ich stelle dir 8 Fragen. Antworte mit ja oder nein.
Fliegt es?
Hat es Federn?
Schwimmt es?
Miaut es?
Hat es Fell?
Ist es grün?
Brüllt es?
Hat es einen Rüssel?
Ich glaube, es ist eine Katze.

Test

Teste dich

1. Was ergibt 62.0 >= 50?
2. Was ist der Unterschied zwischen = und ==?
3. Die Kette if / elif prüft zuerst points >= 50, dann points >= 75. Was passiert bei 95 Punkten?
4. Einen Rabatt gibt es, wenn age < 18 or age >= 65. Bekommt jemand mit 70 Jahren einen Rabatt?
5. Der Tag ist 6. Im match steht case 6: und darunter case 7:. Was wird ausgeführt?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·