Abschnitt 3 · Lektion 4
and, or, not
Rabatt gibt es für Mitglieder, aber erst ab 100 Euro. Freien Eintritt haben Kinder, Rentner und Mitglieder. Beide Regeln haben mehr als eine Bedingung. Die Entscheidungen bis jetzt hatten immer nur eine: ab 50 Euro, ab 92 Punkten, höchstens 2 Kilo. Für solche Regeln hat Python drei Wörter, und sie heißen so, wie man sie auf Englisch sagt.
Beides mit and
stunden = 3
mitglied = True
if mitglied and stunden <= 2:
print("Parken frei")
else:
print("Parken kostet 2 Euro je Stunde.") and verbindet zwei Bedingungen. Das Ganze ist nur dann wahr, wenn beide wahr sind. Auf einem
Vereinsparkplatz parken Mitglieder frei, aber nur bis zu 2 Stunden. Die Person im Beispiel ist
Mitglied, steht aber 3 Stunden dort. Also zahlt sie. Wenn du stunden = 2 einträgst, ist das Parken
frei, und mit mitglied = False kostet es wieder.
Auffällig ist die erste Bedingung, mitglied ganz allein. Da steht kein Vergleich, und es braucht
auch keinen, weil mitglied schon True oder False ist. mitglied == True täte dasselbe. Es ist
nur eine Frage, deren Antwort man schon kennt.
Eins von beiden mit or
70
n alter = int(input("Wie alt bist du? "))
mitglied = input("Bist du Mitglied? (j/n) ")
if alter < 6 or alter >= 65 or mitglied == "j":
print("Eintritt frei")
else:
print("Eintritt: 9 Euro") or ist großzügiger. Hier ist das Ganze wahr, sobald mindestens eine Bedingung wahr ist, und
natürlich auch, wenn alle stimmen. Im Beispiel kommt frei rein, wer unter 6 ist, wer 65 oder älter
ist und wer Mitglied ist. In eingabe.txt steht eine Person mit 70 Jahren ohne Mitgliedschaft. Sie
kommt frei rein, weil eine der drei Bedingungen genügt.
Hier kommt mitglied übrigens aus input() und ist damit Text, nicht True oder False. Deshalb
steht dort ein Vergleich, mitglied == "j".
Das deutsche „oder“ ist an dieser Stelle etwas ungenau. Wenn jemand „Kaffee oder Tee?“ fragt, meint
er eins von beiden und nicht beides. Pythons or meint eins von beiden oder beides. Eine 70-jährige
Vereinsvorsitzende ist also gleich doppelt berechtigt und kommt natürlich trotzdem nur einmal rein.
Das Gegenteil mit not
mitglied = False
if not mitglied:
print("Noch kein Mitglied? Ab dem dritten Besuch lohnt es sich.")
alter = 15
print(not alter >= 18)
print(alter < 18) not dreht eine Bedingung um. Aus True wird False und umgekehrt. if not mitglied: liest sich
fast wie ein deutscher Satz, „wenn nicht Mitglied“.
In den beiden letzten Zeilen steht zweimal dasselbe, not alter >= 18 und alter < 18. Beide sind
wahr, beide meinen dasselbe. Wenn es eine Form ohne not gibt, liest sie sich meistens besser, weil
jede Verneinung ein kleiner Knoten im Kopf ist. Zwei Verneinungen in einer Zeile sind schon ein
großer.
Klammern für den Menschen
alter = 40
schueler = True
studierend = False
# Ermäßigt sind Schüler und Studierende, beide nur unter 27.
print(schueler or studierend and alter < 27)
print((schueler or studierend) and alter < 27) Sobald and und or in einer Bedingung zusammenkommen, wird es heikel. Im Beispiel sind Schüler
und Studierende ermäßigt, aber beide nur unter 27. Geprüft wird eine Person, die 40 ist und zur
Schule geht, zum Beispiel aufs Abendgymnasium. Sie ist über 27, die Antwort müsste also False
lauten.
In der ersten Zeile kommt trotzdem True heraus, denn Python rechnet and vor or, so wie
Punkt vor Strich. Die Zeile wird also als schueler or (studierend and alter < 27) gelesen. Weil
schueler wahr ist, ist das Ganze wahr. Die Altersgrenze gilt so nur noch für Studierende.
In der zweiten Zeile stehen die Klammern da, wo sie gemeint sind. Erst „Schüler oder Studierende“, und davon dann nur die unter 27. Jetzt stimmt die Antwort.
Klammern lohnen sich deshalb überall, wo and und or zusammenkommen, auch wo Python sie nicht
bräuchte. Lesen muss die Zeile später ein Mensch, und das ist oft genug man selbst.
Ein or, das immer stimmt
n antwort = input("Bist du Mitglied? (j/n) ")
if antwort == "j" or "J":
print("Eintritt frei")
else:
print("Eintritt: 9 Euro") Ein Fehler mit or passiert fast jedem einmal. Das Programm soll ein kleines und ein großes J als
„ja“ gelten lassen. In eingabe.txt steht ein n, und trotzdem ist der Eintritt frei.
Gemeint war, dass die Antwort "j" ist oder "J". Geschrieben steht aber antwort == "j" or "J",
und Python liest das als zwei Teile. Der erste ist antwort == "j", und das ist False. Der zweite
ist einfach "J". Ein Text ganz allein, ohne Vergleich, gilt für Python als wahr. Warum das so ist,
kommt in der nächsten Lektion. Für den Moment reicht, dass hinter einem or wieder eine
vollständige Bedingung stehen muss, also antwort == "j" or antwort == "J".
Eine Fehlermeldung gibt es nicht. Das Programm läuft und lässt einfach jeden umsonst rein, was ein Museum vermutlich erst am Monatsende merkt.
Zum Mitnehmen
and verlangt beide Bedingungen, or ist mit einer zufrieden, not dreht eine um. Weil and vor or gerechnet wird, zeigen Klammern, was zusammengehört, und hinter jedem or steht wieder ein ganzer Vergleich.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 5 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.