mitmario.dev

Eingaben, bis sie passen

Python Sandbox 3 Min Lesezeit 3 BeispieleLektion 3 von 6

Wenn jemand vier statt 4 tippt, endet das Programm mit einem ValueError. Was über input() hereinkommt, ist Text, und int() macht nur dann eine Zahl daraus, wenn es eine ist. Mit try und except lässt sich der Fehler abfangen. Nur reicht Abfangen allein nicht.

Abgefangen und trotzdem abgestürzt

Abgefangen, und dann?
try:
    personen = int(input("Für wie viele Personen? "))
except ValueError:
    print("Das war keine Zahl.")
print(f"Tisch für {personen} Personen ist reserviert.")

Ein Restaurant will wissen, für wie viele Personen reserviert werden soll, und bekommt vier. Der ValueError wird abgefangen, da steht Das war keine Zahl., und eine Zeile später bricht das Programm trotzdem ab. Diesmal mit NameError: name 'personen' is not defined.

Das ist eigentlich logisch. int() ist gescheitert, also ist die Zuweisung an personen nie passiert, und in der letzten Zeile wird mit einem Wert gearbeitet, den es gar nicht gibt. Wenn ein Programm eine Antwort braucht, kann es nach einer falschen nicht einfach weitermachen. Es muss noch einmal fragen.

Fragen, bis es passt

Fragen, bis es eine Zahl ist
while True:
    try:
        personen = int(input("Für wie viele Personen? "))
        break
    except ValueError:
        print("Bitte eine Zahl eingeben, zum Beispiel 4.")
print(f"Tisch für {personen} Personen ist reserviert.")

Das ist die Form aus Lektion 4.4, while True mit break. Neu ist nur das try darin. Wenn die Umwandlung gelingt, kommt das break dran, und die Schleife ist vorbei. Wenn nicht, springt Python in den except-Block und überspringt dabei das break, weil es hinter der Zeile steht, die gescheitert ist. Die Schleife beginnt also von vorn, und es wird noch einmal gefragt. Hinter der Schleife ist damit sicher, dass personen eine Zahl hat.

In eingabe.txt stehen zwei Antworten, erst vier und dann 4. Im Terminal siehst du den ganzen Wortwechsel.

Steht eine 0 in der ersten Zeile der Datei, kommt Tisch für 0 Personen ist reserviert. heraus. Das ist die zweite Art von falsch. Python hat mit dieser Zahl kein Problem, das Restaurant schon, denn es hat Tische für 1 bis 12 Personen. Ein try hilft hier nicht, weil gar kein Fehler auftritt.

Was hilft, ist ein if nach der Umwandlung. Es prüft, ob die Zahl im erlaubten Bereich liegt, und das break kommt erst dran, wenn auch das stimmt. Passt die Zahl nicht, gibt es eine Meldung, und die Frage kommt von vorn.

Wenn in eingabe.txt keine passende Antwort mehr steht, endet das Programm mit dem EOFError aus Lektion 2.6. Es wird weiter gefragt, aber es kommt nichts mehr. Auf deinem eigenen Rechner tippst du die Antworten selbst, dort passiert das nicht.

Eine Meldung, die weiterhilft

Wenn eine Frage wiederholt wird, ist die Meldung dazwischen das Einzige, was der Mensch davor zu lesen bekommt. Bei Falsche Eingabe. weiß er nur, dass er etwas falsch gemacht hat. Was, darf er raten. Bitte eine Zahl eingeben, zum Beispiel 4. sagt, was erwartet wird, und durch das Beispiel ist auch klar, dass vier nicht gemeint war. Bei der zweiten Art von falsch ist es genauso. Wer 0 eingibt, braucht nicht Ungültig., sondern den Bereich, der geht.

Zwei Arten von falsch heißt also zwei Meldungen. Mit Höflichkeit hat das wenig zu tun. Wer 20 Personen eingibt und dann liest, er solle eine Zahl eingeben, versteht die Welt nicht mehr. Er hat ja eine eingegeben.

Eine Funktion, die fragt

Eine Funktion, die fragt
def frage_zahl(frage):
    while True:
        try:
            return int(input(frage))
        except ValueError:
            print("Bitte eine ganze Zahl eingeben.")


erwachsene = frage_zahl("Wie viele Erwachsene? ")
kinder = frage_zahl("Wie viele Kinder? ")
print(f"Tisch für {erwachsene + kinder} Personen ist reserviert.")

Wenn ein Programm mehr als einmal nach einer Zahl fragt, steht die Schleife sonst zweimal da. Packt man sie in eine Funktion wie in Abschnitt 8, steht sie nur einmal da, und aus dem break wird ein return. Sobald die Umwandlung gelingt, gibt die Funktion die Zahl zurück, und damit ist auch die Schleife vorbei. Bei der ersten Frage braucht es hier zwei Anläufe, bei der zweiten einen.

Was die Aufgabe will

Ein Webshop fragt nach der Menge, und Mias Laden verschickt höchstens 99 Stück je Artikel. Das Programm dort nimmt heute jede Antwort, solange sie eine Zahl ist, und stürzt bei allem anderen ab. Es soll so lange fragen, bis eine Menge kommt, die passt, und für jede der beiden Arten von falsch eine eigene Meldung haben.

Zum Mitnehmen

Wenn ein Programm eine Antwort braucht, fragt es in einer while-True-Schleife so lange, bis eine brauchbare kommt, mit try um die Umwandlung und break erst am Ende. Falsch sein kann eine Antwort als Wort statt Zahl oder als Zahl, die keinen Sinn ergibt. Beide Fälle bekommen ihre eigene Meldung, und die sagt, was erwartet wird.

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

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.