Der einfachste Weg, dies zu erreichen, besteht darin, die input
-Methode in einer While-Schleife zu platzieren. Verwende continue
, wenn du eine falsche Eingabe erhältst, und break
, wenn du zufrieden bist.
Wenn Ihre Eingabe eine Ausnahme auslösen könnte
Verwenden Sie try
und except
, um zu erkennen, wenn der Benutzer Daten eingibt, die nicht analysiert werden können.
while True:
try:
# Hinweis: Benutzer von Python 2.x sollten raw_input verwenden, das Äquivalent zu 3.x's Eingabe
alter = int(input("Bitte geben Sie Ihr Alter ein: "))
except ValueError:
print("Entschuldigung, das habe ich nicht verstanden.")
#versuchen Sie es erneut... Zurück zum Anfang der Schleife
continue
else:
#Das Alter wurde erfolgreich analysiert!
#wir sind bereit, die Schleife zu verlassen.
break
if alter >= 18:
print("Sie können in den Vereinigten Staaten abstimmen!")
else:
print("Sie können in den Vereinigten Staaten nicht abstimmen.")
Implementieren Ihrer eigenen Validierungsregeln
Wenn Sie Werte ablehnen möchten, die von Python erfolgreich analysiert werden können, können Sie Ihre eigene Validierungslogik hinzufügen.
while True:
daten = input("Bitte geben Sie eine laute Nachricht ein (muss alles großgeschrieben sein): ")
if not daten.isupper():
print("Entschuldigung, Ihre Antwort war nicht laut genug.")
continue
else:
#wir sind zufrieden mit dem gegebenen Wert.
#wir sind bereit, die Schleife zu verlassen.
break
while True:
daten = input("Wählen Sie eine Antwort von A bis D:")
if daten.lower() not in ('a', 'b', 'c', 'd'):
print("Keine angemessene Auswahl.")
else:
break
Kombinieren von Ausnahmebehandlung und benutzerdefinierter Validierung
Beide obigen Techniken können in einer Schleife kombiniert werden.
while True:
try:
alter = int(input("Bitte geben Sie Ihr Alter ein: "))
except ValueError:
print("Entschuldigung, das habe ich nicht verstanden.")
continue
if alter < 0:
print("Entschuldigung, Ihre Antwort darf nicht negativ sein.")
continue
else:
#Das Alter wurde erfolgreich analysiert, und wir sind mit seinem Wert zufrieden.
#wir sind bereit, die Schleife zu verlassen.
break
if alter >= 18:
print("Sie können in den Vereinigten Staaten abstimmen!")
else:
print("Sie können in den Vereinigten Staaten nicht abstimmen.")
Alles in einer Funktion zusammenfassen
Wenn Sie Ihren Benutzer nach vielen verschiedenen Werten fragen müssen, kann es nützlich sein, diesen Code in eine Funktion zu setzen, damit Sie ihn nicht jedes Mal neu eingeben müssen.
def get_non_negative_int(prompt):
while True:
try:
wert = int(input(prompt))
except ValueError:
print("Entschuldigung, das habe ich nicht verstanden.")
continue
if wert < 0:
print("Entschuldigung, Ihre Antwort darf nicht negativ sein.")
continue
else:
break
return wert
alter = get_non_negative_int("Bitte geben Sie Ihr Alter ein: ")
kinder = get_non_negative_int("Bitte geben Sie die Anzahl Ihrer Kinder ein: ")
gehalt = get_non_negative_int("Bitte geben Sie Ihr jährliches Einkommen in Dollar ein: ")
Alles zusammenfügen
Sie können diese Idee erweitern, um eine sehr generische Eingabefunktion zu erstellen:
def sanitised_input(prompt, type_=None, min_=None, max_=None, range_=None):
if min_ ist nicht None und max_ ist nicht None und max_ < min_:
raise ValueError("min_ muss kleiner oder gleich max_ sein.")
while True:
ui = input(prompt)
if type_ ist nicht None:
try:
ui = type_(ui)
except ValueError:
print("Eingabetyp muss {0} sein.".format(type_.__name__))
continue
if max_ ist nicht None und ui > max_:
print("Eingabe muss kleiner oder gleich {0} sein.".format(max_))
elif min_ ist nicht None und ui < min_:
print("Eingabe muss größer oder gleich {0} sein.".format(min_))
elif range_ ist nicht None und ui not in range_:
if isinstance(range_, range):
template = "Eingabe muss zwischen {0.start} und {0.stop} sein."
print(template.format(range_))
else:
template = "Eingabe muss {0} sein."
if len(range_) == 1:
print(template.format(*range_))
else:
expected = " oder ".join((
", ".join(str(x) for x in range_[:-1]),
str(range_[-1])
))
print(template.format(expected))
else:
return ui
Mit Verwendung wie:
alter = sanitised_input("Geben Sie Ihr Alter ein: ", int, 1, 101)
antwort = sanitised_input("Geben Sie Ihre Antwort ein: ", str.lower, range_=('a', 'b', 'c', 'd'))
Gängige Fallstricke und warum Sie sie vermeiden sollten
Die redundante Verwendung von redundanten input
-Anweisungen
Diese Methode funktioniert, wird jedoch im Allgemeinen als schlechter Stil angesehen:
daten = input("Bitte geben Sie eine laute Nachricht ein (muss alles großgeschrieben sein): ")
while not daten.isupper():
print("Entschuldigung, Ihre Antwort war nicht laut genug.")
daten = input("Bitte geben Sie eine laute Nachricht ein (muss alles großgeschrieben sein): ")
Es mag anfangs attraktiv aussehen, weil es kürzer ist als die Methode while True
, verstößt jedoch gegen das Don't Repeat Yourself Prinzip der Softwareentwicklung. Dies erhöht die Wahrscheinlichkeit von Fehlern in Ihrem System. Was ist, wenn Sie zurückportieren möchten auf 2.7, indem Sie input
in raw_input
ändern, aber versehentlich nur das erste input
oben ändern? Es ist ein SyntaxError
, der nur darauf wartet, zu passieren.
Rekursion wird Ihren Stack sprengen
Wenn Sie gerade erst etwas über Rekursion gelernt haben, könnten Sie versucht sein, sie in get_non_negative_int
zu verwenden, damit Sie die While-Schleife beseitigen können.
def get_non_negative_int(prompt):
try:
wert = int(input(prompt))
except ValueError:
print("Entschuldigung, das habe ich nicht verstanden.")
return get_non_negative_int(prompt)
if wert < 0:
print("Entschuldigung, Ihre Antwort darf nicht negativ sein.")
return get_non_negative_int(prompt)
else:
return wert
Dies scheint die meiste Zeit gut zu funktionieren, aber wenn der Benutzer häufig genug ungültige Daten eingibt, wird das Skript mit einem RuntimeError: maximum recursion depth exceeded
beendet. Sie könnten denken "kein Narr würde 1000 Fehler hintereinander machen", aber Sie unterschätzen die Genialität der Narren!