757 Stimmen

Den Benutzer um Eingabe bitten, bis er eine gültige Antwort gibt

Ich schreibe ein Programm, das Benutzereingaben akzeptiert.

#Hinweis: Python-2.7-Benutzer sollten `raw_input` verwenden, das Äquivalent zu 3.X's `input`
age = int(input("Bitte geben Sie Ihr Alter ein: "))
if age >= 18: 
    print("Sie können in den Vereinigten Staaten wählen!")
else:
    print("Sie können in den Vereinigten Staaten nicht wählen.")

Das Programm funktioniert wie erwartet, solange der Benutzer sinnvolle Daten eingibt.

Bitte geben Sie Ihr Alter ein: 23
Sie können in den Vereinigten Staaten wählen!

Aber es scheitert, wenn der Benutzer ungültige Daten eingibt:

Bitte geben Sie Ihr Alter ein: dickety six
Traceback (most recent call last):
  File "canyouvote.py", Zeile 1, in 
    age = int(input("Bitte geben Sie Ihr Alter ein: "))
ValueError: ungültige Dezimalzahl für int() zur Basis 10: 'dickety six'

Statt abzustürzen, möchte ich, dass das Programm erneut nach der Eingabe fragt. So:

Bitte geben Sie Ihr Alter ein: dickety six
Entschuldigung, das habe ich nicht verstanden.
Bitte geben Sie Ihr Alter ein: 26
Sie können in den Vereinigten Staaten wählen!

Wie bitte ich um gültige Eingaben anstelle von Absturz oder Akzeptanz ungültiger Werte (z.B. -1)?

-1voto

Patrick Artner Punkte 47282

Eine weitere Lösung zur Verwendung der Eingabevalidierung unter Verwendung eines benutzerdefinierten ValidationError und einer (optionalen) Bereichsvalidierung für Ganze-Zahlen-Eingaben:

class ValidationError(ValueError): 
    """Spezieller Validierungsfehler - dessen Nachricht soll gedruckt werden"""
    pass

def RangeValidator(text,num,r):
    """Generischer Validierer - wirft 'text' als ValidationError, wenn 'num' nicht im Bereich von 'r' liegt."""
    if num in r:
        return num
    raise ValidationError(text)

def ValidCol(c): 
    """Spezialisierter Spaltenvalidierer, der Text und Bereich bereitstellt."""
    return RangeValidator("Die Spalten müssen im Bereich von 0 bis 3 (einschließlich) liegen", 
                          c, range(4))

def ValidRow(r): 
    """Spezialisierter Zeilenvalidierer, der Text und Bereich bereitstellt."""
    return RangeValidator("Die Zeilen müssen im Bereich von 5 bis 15 (exklusiv) liegen",
                          r, range(5,15))

Verwendung:

def GetInt(text, validator=None):
    """Fragt den Benutzer nach Ganzzahl-Eingabe, bis eine gültige Ganzzahl angegeben wird. Wenn angegeben, 
    nimmt eine 'validator'-Funktion die Ganzzahl und gibt entweder eine 
    ValidationError zurück, um gedruckt zu werden, oder gibt die gültige Nummer zurück. 
    Nicht-Ganzzahlen zeigen eine einfache Fehlermeldung."""
    print()
    while True:
        n = input(text)
        try:
            n = int(n)

            return n if validator is None else validator(n)

        except ValueError as ve:
            # gibt ValidationErrors direkt aus - sonst generelle Meldung:
            if isinstance(ve, ValidationError):
                print(ve)
            else:
                print("Ungültige Eingabe: ", n)

spalte = GetInt("Bitte Spalte eingeben: ", ValidCol)
zeile = GetInt("Bitte Zeile eingeben: ", ValidRow)
print( zeile, spalte)

Ausgabe:

Bitte Spalte eingeben: 22
Die Spalten müssen im Bereich von 0 bis 3 (einschließlich) liegen
Bitte Spalte eingeben: -2
Die Spalten müssen im Bereich von 0 bis 3 (einschließlich) liegen
Bitte Spalte eingeben: 2
Bitte Zeile eingeben: a
Ungültige Eingabe:  a
Bitte Zeile eingeben: 72
Die Zeilen müssen im Bereich von 5 bis 15 (exklusiv) liegen
Bitte Zeile eingeben: 9  

9, 2

-1voto

Sie können die Eingabeaufforderung in einer while True-Schleife so gestalten, dass sie wiederholt nach der Benutzereingabe fragt und dann diese Schleife unterbricht, wenn der Benutzer die gewünschte Antwort eingibt. Und Sie können try- und except-Blöcke verwenden, um ungültige Antworten zu behandeln.

while True:

    var = True

    try:
        age = int(input("Bitte geben Sie Ihr Alter ein: "))

    except ValueError:
        print("Ungültige Eingabe.")
        var = False

    if var == True:
        if age >= 18:
            print("Sie können in den Vereinigten Staaten wählen.")
            break
        else:
            print("Sie können in den Vereinigten Staaten nicht wählen.")

Die var-Variable dient nur dazu, dass das Programm "Sie können in den Vereinigten Staaten nicht wählen" zurückgibt, wenn der Benutzer einen String anstelle einer Ganzzahl eingibt.

-1voto

Sie können allgemeinere Logik schreiben, um dem Benutzer zu erlauben, nur eine bestimmte Anzahl von Malen einzugeben, da das gleiche Anwendungsfall in vielen realen Anwendungen auftritt.

def getValidInt(iMaxAttemps = None):
  iCount = 0
  while True:
    # Abbruch, wenn das maximale Versuchslimit abgelaufen ist
    if iCount != None and iCount > iMaxAttemps:
       return 0     # Rückgabe als Standardwert

    i = raw_input("Geben Sie eine Nummer ein")
    try:
       i = int(i)
    except ValueError as e:
       print "Geben Sie einen gültigen Ganzzahlwert ein"
    else:
       break

    return i

age = getValidInt()
# Machen Sie, was auch immer Sie tun möchten.

-1voto

2Cubed Punkte 3471

Während ein try/except-Block funktionieren wird, ist ein viel schnellerer und sauberer Weg, um diese Aufgabe zu erledigen, die Verwendung von str.isdigit().

while True:
    alter = input("Bitte geben Sie Ihr Alter ein: ")
    if alter.isdigit():
        alter = int(alter)
        break
    else:
        print("Ungültige Zahl '{alter}'. Bitte versuchen Sie es erneut.".format(alter=alter))

if alter >= 18: 
    print("Sie können in den Vereinigten Staaten wählen!")
else:
    print("Sie können in den Vereinigten Staaten nicht wählen.")

-2voto

Rein F Punkte 308

Verwenden Sie isdigit(), um zu überprüfen, ob ein String eine gültige Ganzzahl darstellt.

Sie könnten eine rekursive Funktion verwenden.

def fragen():
    antwort = input("Bitte geben Sie den Betrag ein, den Sie umrechnen möchten: ")
    if not antwort.isdigit():
        print("Ungültig")
        return fragen()

    return int(antwort)

Gdp = fragen()

Oder eine While-Schleife

while True:
    antwort = input("Bitte geben Sie den Betrag ein, den Sie umrechnen möchten: ")
    if not antwort.isdigit():
        print("Ungültig")
        continue

    Gbp = int(antwort)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X