HOWTO · Python
Python While-Schleife Benutzereingabe
Wir können die Funktion input() innerhalb einer While-Schleife verwenden, um Daten einzugeben, bis eine bestimmte Bedingung in Python erfüllt ist.
Auf dieser Seite
Verwenden Sie Python’s input() in einer while-Schleife, wenn ein Kommandozeilenprogramm erneut fragen soll, bis die Person ein festgelegtes Wort oder eine Menüoption eingibt. Lesen Sie jede Antwort als Text, prüfen Sie, ob sie „weiter“ oder „beenden“ bedeutet, und wandeln Sie sie erst dann in eine Zahl um, wenn Sie geprüft haben, dass sie gültig ist.
Die Funktion input() verstehen
In Python 3 zeigt input() die Eingabeaufforderung an, wartet, bis die Person die Eingabetaste drückt, und gibt die eingegebene Zeile als Zeichenkette zurück. Der Rückgabewert ist Text, auch wenn er wie eine Zahl aussieht: Bei der Eingabe von 12 entsteht beispielsweise die Zeichenkette "12" und nicht die Ganzzahl 12. Wandeln Sie den Wert nur mit int() oder float() um, wenn der nächste Verarbeitungsschritt eine Zahl benötigt.
Bei einem kleinen interaktiven Programm sollte die Eingabeaufforderung klar beschreiben, was eingegeben werden soll. Eine Antwort lässt sich als Text vergleichen, speichern oder an eine Umwandlungsfunktion übergeben. Ein einmaliger Aufruf von input() liest eine Zeile. Erst wenn Sie diesen Aufruf in eine Schleife setzen, kann das Programm wiederholt Antworten erfassen. Sehen Sie sich zunächst eine einzelne Eingabe mit anschließender Antwort an, bevor Sie eine Schleife ergänzen:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
from io import StringIO
import sys
sys.stdin = StringIO("Ada\n")
name = input("What is your name? ")
print("Hello,", name)
What is your name? Hello, Ada
Das Beispiel speist Ada über die Standardeingabe ein, damit es ohne Tastatureingabe ausgeführt werden kann. In einem interaktiven Terminal lassen Sie die Zeilen mit StringIO und sys.stdin weg. Dann wartet input(), bis die Person einen Namen eingibt und die Eingabetaste drückt; anschließend erscheint die Begrüßung in der nächsten Zeile. Eingabeaufforderungen und angezeigte Texte im unveränderten Beispiel bleiben auf Englisch.
Mit einer while-Schleife fortlaufend Eingaben erfassen
Ein Abbruchwert (Sentinel) ist ein Wert, der das Ende der Schleife signalisiert, zum Beispiel done. Initialisieren Sie den Wert vor der Schleife, damit ihre Bedingung bereits beim ersten Durchlauf geprüft werden kann. Lesen Sie bei jedem Durchlauf eine neue Antwort ein und aktualisieren Sie den Wert. Stimmt er mit dem Abbruchwert überein, endet die Schleife bei der nächsten Prüfung ihrer Bedingung. Wählen Sie einen Abbruchwert, der nicht mit gültigen Daten verwechselt werden kann, und vergleichen Sie ihn einheitlich. Normalisieren Sie zum Beispiel die Groß- und Kleinschreibung, wenn auch DONE die Schleife beenden soll.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
responses = iter(["red", "blue", "done"])
def read_response(prompt):
print(prompt, end="")
response = next(responses)
print(response)
return response
answer = ""
while answer != "done":
answer = read_response("Enter a color (done to finish): ")
if answer != "done":
print("Saved:", answer)
Enter a color (done to finish): red
Saved: red
Enter a color (done to finish): blue
Saved: blue
Enter a color (done to finish): done
Das Beispiel verwendet über read_response eine feste Eingabefolge, damit sich der Ablauf reproduzieren lässt. Ersetzen Sie in einem Terminalprogramm den Aufruf dieser Hilfsfunktion durch input("Enter a color (done to finish): "); der Vergleich mit dem Abbruchwert und die Schleifenstruktur bleiben dabei erhalten. Die Schleife liest den Abbruchwert ein, speichert ihn aber nicht. Fehlt die Aktualisierung, kann die Bedingung dauerhaft wahr bleiben. Deshalb muss jeder weitere Durchlauf eine neue Antwort einlesen. Die Eingabeaufforderung und die angezeigten Texte im unveränderten Beispiel sind weiterhin auf Englisch.
Eingaben validieren
Lesen Sie eine Antwort als Text ein und prüfen Sie den Abbruchwert, bevor Sie den Text umwandeln. Rufen Sie int() innerhalb eines try/except ValueError-Blocks auf und lassen Sie die Schleife nach einem Umwandlungsfehler erneut fragen. Dieses eigenständige Beispiel verwendet eine feste Eingabefolge, um gültige, ungültige und beendende Eingaben zu zeigen. Ersetzen Sie in einem interaktiven Terminalprogramm read_response(...) durch input(...).
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
responses = iter(["oops", "7", "exit"])
def read_response(prompt):
print(prompt, end="")
response = next(responses)
print(response)
return response
while True:
text = read_response("Enter an integer (exit to finish): ").strip()
if text.lower() == "exit":
break
try:
number = int(text)
except ValueError:
print("Please enter a whole number.")
continue
print("Accepted:", number)
Enter an integer (exit to finish): oops
Please enter a whole number.
Enter an integer (exit to finish): 7
Accepted: 7
Enter an integer (exit to finish): exit
Der Abbruchwert wird vor int() geprüft, sodass exit die Schleife ohne Umwandlungsversuch beendet. Nach einem ValueError kehrt continue zur Eingabeaufforderung zurück; gültige Ganzzahlen gelangen in den Zweig für akzeptierte Werte. Dezimalzahlen wie 3.5 sind keine Ganzzahlen. Verwenden Sie float(), wenn Dezimalwerte zulässig sind. Mit strip() lassen sich umgebende Leerzeichen entfernen, und lower() ermöglicht einen Vergleich des Abbruchwerts ohne Beachtung der Groß- und Kleinschreibung. Die Eingabeaufforderungen und Ausgaben im unveränderten Beispiel bleiben auf Englisch.
Ein menügesteuertes Programm erstellen
Eine Menüschleife zeigt Optionen an, liest jede Auswahl als Text ein, führt die zugehörige Aktion aus und wiederholt den Ablauf, bis ausdrücklich die Option zum Beenden ausgewählt wird. Das Beispiel addiert oder subtrahiert zwei Ganzzahlen. Seine festen Antworten umfassen eine unbekannte Auswahl, beide Rechenoperationen und die Beendigungsoption. Ersetzen Sie in einem Terminalprogramm read_response(...) durch input(...). Falls die Personen beliebige Operanden eingeben können, ergänzen Sie außerdem dieselbe Ganzzahlvalidierung wie oben.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
responses = iter(["x", "1", "4", "5", "2", "9", "3", "3"])
def read_response(prompt):
print(prompt, end="")
response = next(responses)
print(response)
return response
while True:
print("1) Add 2) Subtract 3) Exit")
choice = read_response("Choice: ")
if choice == "3":
print("Goodbye.")
break
elif choice == "1":
left = int(read_response("First number: "))
right = int(read_response("Second number: "))
print("Result:", left + right)
elif choice == "2":
left = int(read_response("First number: "))
right = int(read_response("Second number: "))
print("Result:", left - right)
else:
print("Choose 1, 2, or 3.")
1) Add 2) Subtract 3) Exit
Choice: x
Choose 1, 2, or 3.
1) Add 2) Subtract 3) Exit
Choice: 1
First number: 4
Second number: 5
Result: 9
1) Add 2) Subtract 3) Exit
Choice: 2
First number: 9
Second number: 3
Result: 6
1) Add 2) Subtract 3) Exit
Choice: 3
Goodbye.
Der Beendigungszweig wird ausgeführt, bevor nach einem der Operanden gefragt wird. Bei einer unbekannten Auswahl gibt das Programm einen Hinweis aus und zeigt danach erneut das Menü an. Jede gültige Rechenoperation liest zwei Operanden ein und zeigt das Ergebnis an. Dieselbe Struktur kann Funktionen aufrufen, Einstellungen ändern oder Informationen ausgeben. Eine gemeinsame Validierung lässt sich in eine Hilfsfunktion auslagern. Die Eingabeaufforderungen und Ausgaben im unveränderten Beispiel bleiben auf Englisch.
Python-2-Eingaben in älterem Code
Python 2 ist eine veraltete Laufzeitumgebung. Laut dem Hinweis der Python Software Foundation zum Ende von Python 2 endete ihr Lebenszyklus am 1. Januar 2020. In Python 2 liest raw_input() eine Zeile und gibt sie als Text zurück, während input() den eingegebenen Ausdruck auswertet. Das unterscheidet sich von Python 3, wo input() Text zurückgibt. Wenn Sie älteren Python-2-Code warten, der Text erwartet, ist raw_input() die passende Funktion. Übertragen Sie die Annahme zum Verhalten von input() in Python 3 nicht auf diesen Code. Verwenden Sie für neue Programme Python 3 und dessen Funktion input().