mitmario.dev

and, or, not

Python Sandbox 4 Min Lesezeit 5 BeispieleLektion 4 von 7

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

Beides muss stimmen
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

Eins von beiden reicht
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

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

Klammern sagen, was zusammengehört
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

Ein or, das immer stimmt
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, kostenlos

Zu 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.