mitmario.dev

Leer und None

Python Sandbox 4 Min Lesezeit 4 BeispieleLektion 5 von 7

if antwort == "j" or "J": lässt jeden durch, auch bei einem n. Ein "J" allein, ganz ohne Vergleich, reicht Python als Bedingung, und der Text zählt dann, als stünde dort True. Das liegt daran, dass ein if mit jedem Wert etwas anfangen kann, nicht nur mit True und False. Manche Werte gelten dabei als wahr, andere als falsch. Und dann gibt es noch einen besonderen Wert, der „hier ist noch nichts“ bedeutet.

Was als falsch gilt

Was als falsch gilt
print(bool(0), bool(0.0), bool(""), bool(None))
print(bool(7), bool(-1), bool("0"), bool(" "), bool("Nein"))

bool() verwandelt einen Wert in True oder False, und zwar genau so, wie ein if ihn sehen würde. Es funktioniert wie int() und float() aus Lektion 2.5, nur dass am Ende eben wahr oder falsch herauskommt.

Die Regel dahinter ist kürzer, als man denkt. Falsch ist, was leer ist oder null:

  • False selbst
  • die Zahl 0, auch als 0.0
  • der leere Text ""
  • None, dazu gleich mehr
  • und alles andere, was leer sein kann, etwa eine leere Liste, die in Abschnitt 5 dazukommt

Alles andere gilt als wahr. In der zweiten Zeile im Beispiel stehen die Fälle, die überraschen. Eine negative Zahl ist wahr. Der Text "0" ist wahr, weil er nicht leer ist. Er enthält ja ein Zeichen. Ein Text aus einem einzigen Leerzeichen ist wahr. Und sogar der Text "Nein" ist wahr. Python liest keine Wörter, es schaut nur, ob etwas da ist.

Damit ist auch das "J" aus der letzten Lektion geklärt. Weil es ein Text ist, der nicht leer ist, gilt es als wahr, sodass die ganze Bedingung immer erfüllt war.

Wenn nichts eingegeben wurde

Wenn nichts eingegeben wurde
name = input("Wie heißt du? ")
if name:
    print(f"Hallo {name}!")
else:
    print("Hallo Unbekannt!")

Am nützlichsten ist die Regel bei Eingaben. Wenn jemand auf eine Frage nur Enter drückt, kommt ein leerer Text an. if name: ist also die kurze Form von „wenn etwas eingegeben wurde“. Ausgeschrieben hieße es if name != "":, und beides tut dasselbe. In Python ist die kurze Form die übliche.

In eingabe.txt steht diesmal eine leere Zeile, so als hätte jemand nur Enter gedrückt. Die Frage bleibt deshalb ohne Antwort stehen, und darunter kommt der Gruß an Unbekannt. Mit einem Namen in der Datei wird der Gruß persönlich. Wenn dagegen gar nichts darin steht, nicht einmal eine leere Zeile, kommt der EOFError aus Lektion 2.6. Dann fehlt nicht nur die Antwort, sondern die ganze Zeile.

Noch kein Wert mit None

Noch kein Wert
preis = 20
rabatt = None
print(rabatt)
print(type(rabatt))
print(rabatt is None)
print(preis - rabatt)

Manchmal gibt es für eine Variable noch keinen Wert, und das soll man ihr ansehen. Ein Rabatt, der noch nicht feststeht. Ein Name, nach dem noch niemand gefragt hat. Dafür hat Python einen eigenen Wert, None, auf Deutsch „keiner“. Er hat einen eigenen Typ, NoneType, und von diesem Typ gibt es nur ihn.

None ist etwas anderes als 0 oder "". Null ist eine Zahl, mit der man rechnen kann. Ein leerer Text ist ein Text. None heißt, hier steht noch gar nichts. Rechnen geht damit deshalb schief, so wie in der letzten Zeile des Beispiels: TypeError: unsupported operand type(s) for -: 'int' and 'NoneType'. Minus geht nicht zwischen einer ganzen Zahl und None. Wenn du diese Meldung siehst, und das wird noch öfter passieren, hat fast immer eine Variable nicht den Wert bekommen, den du erwartet hast.

Ob eine Variable None ist, fragt man mit is None und nicht mit ==. Beides funktioniert fast immer, aber is None ist die übliche Form und sagt genauer, was gemeint ist, nämlich ob hier wirklich das Nichts steht. Das Gegenstück heißt is not None.

Null ist nicht nichts

Null ist nicht nichts
rabatt = 0

if rabatt:
    print(f"Rabatt: {rabatt} Prozent")
else:
    print("Noch kein Rabatt eingetragen")

if rabatt is None:
    print("Noch kein Rabatt eingetragen")
else:
    print(f"Rabatt: {rabatt} Prozent")

Die kurze Form hat eine Falle. Im Beispiel steht der Rabatt fest, und er beträgt 0 Prozent. Nach der ersten Bedingung, if rabatt:, ist trotzdem noch keiner eingetragen. Für sie sehen 0 und „nichts“ gleich aus, beides ist falsch.

Die zweite Bedingung fragt genauer, if rabatt is None:, und hält die beiden auseinander. None heißt „steht noch nicht fest“. 0 heißt „steht fest, und zwar null“.

Die kurze Form passt also nur, wo leer und null wirklich dasselbe bedeuten. Überall sonst ist null eine echte Antwort. Ein if menge: hält sie aber für „nichts eingegeben“, egal ob null Brötchen bestellt, null Euro Trinkgeld gegeben oder null Fehler gefunden wurden.

Zum Mitnehmen

Für ein if ist nicht nur False falsch, sondern auch 0, ein leerer Text und None. Das macht viele Bedingungen kurz und manche falsch, nämlich dann, wenn 0 eine echte Antwort ist.

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 4 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.