Python - Problem wie ich eine falsche Eingabe abfangen kann?
Hallo liebe helfende.
Ich möchte mit input() die Eingabe von "n" oder "h" oder "q" erfragen und wenn was falsches eingegeben wurde soll die selbe input Frage wieder von neuen kommen, solange bis was richtiges eingegebenn wurde. Glaub mein Beispiel erkärt es besser.
def frage():
frage = input('Bitte gib ein n für nehmen oder ein h für halten ein! Zum Spiel beenden bitte ein q eintippen!').lower()
print()
print()
if frage == 'n':
nehmen()
elif frage == 'h':
halten()
elif frage == 'q':
spiel_ende()
else:
print('Ungültige Eingabe')
frage()
Hat jemand eine Idee wie man das richtig machen könnte? Weil jetzt kommt immer die Fehlermeldung:
'str' object is not callable
Vielen Dank im Voraus
3 Antworten
Du hast hier deine Funktion und eine lokale Variable darin identisch benannt: beide heißen "frage". Das ist mal ein bisschen ungeschickt und führt zu dieser Fehlermeldung.
Das zweite Thema ist aber, dass du hier eine wohl unbeabsichtigte Rekursion machen würdest: du rufst die Funktion innerhalb der Funktion wieder auf. Sinnvoller wäre eine Schleife.
Beides würde wohl funktionieren (es würde sehr viele Wiederholungen brauchen, bis der Stack voll ist), sinnvoll ist die Rekursion hier aber trotzdem nicht.
Ok stimmt. RecursionError wäre bei ~1000 Repeats schon möglich, aber eher unwarscheinlich. Bei der Frage, ob es sinnvoll ist, stimme ich dir zu. Wobei es zum lernen, was Rekursion ist ein nettes Beispiel sein kann
Das mit der Rekursion sollte ja so sein, dass es so lange aufgerufen wird bis was richtig eingegeben wurde. Mit einer while Schleife bekomm ich es auch nicht hin. Hat niemand eine Idee wie man das richtig machen könnte?
Beispiel mit while Schleife wäre etwa so:
(das inp not in "nhq" kann auch durch eine extra break-condition oder variable ersetzt werden)
inp = ""
while inp not in "nhq":
inp = input('Bitte gib ein n für nehmen oder ein h für halten ein! Zum Spiel beenden bitte ein q eintippen!').lower()
print()
print()
if inp == 'n':
nehmen()
elif inp == 'h':
halten()
elif inp == 'q':
spiel_ende()
Nein, du solltest dann auch alle weiteren frage variablen umbennen (außer dem Funktionscall)
def frage():
frage_inp = input('Bitte gib ein n für nehmen oder ein h für halten ein! Zum Spiel beenden bitte ein q eintippen!').lower()
print()
print()
if frage_inp == 'n':
nehmen()
elif frage_inp == 'h':
halten()
elif frage_inp == 'q':
spiel_ende()
else:
print('Ungültige Eingabe')
frage()
Vielen Dank. Das funktioniert. Ich versteh es zwar nicht was das für einen Unterschied macht, weil frage() ja eigentlich nicht auf die Variable zugreifen sollte, aber jetzt funktioniert es. Vielen herzlichen Dank für die Hilfe und die Zeit. Wünsche Schöne Feiertage.
Naja, der Name ist der Name bzw. die Variable ist die Variable. Ob da jz eine Funktion oder ein beliebiger Wert/DatenTyp drin gespeichert wird ist ja egal
na, weil die variable frage und die Funktion Frage gleich heißen. deshalb wird nach frage=input(...) es keine Funktion frage(9 mehr geben.
Du redefinierst frage als Variable und willst es dann wieder callen.
Solltest den input in eine andere Variable bspw: frage_inp speichern
Hast du das so gemeint:?
def frage():
frage_inp = input('Bitte gib ein n für nehmen oder ein h für halten ein! Zum Spiel beenden bitte ein q eintippen!').lower()
frage = frage_inp
print()
print()
if frage == 'n':
nehmen()
elif frage == 'h':
halten()
elif frage == 'q':
spiel_ende()
else:
print('Ungültige Eingabe')
frage()
Weil das funktioniert auch leider nicht?
Nein, so :
def frage():
frage_inp = input('Bitte gib ein n für nehmen oder ein h für halten ein! Zum Spiel beenden bitte ein q eintippen!').lower()
print()
print()
if frage_inp == 'n':
nehmen()
elif frage_inp== 'h':
halten()
elif frage_inp == 'q':
spiel_ende()
else:
print('Ungültige Eingabe')
frage()
und auserdem : was macht die Funktion
.lower()
?
Es kovertiert jeden Charakter, egal ob groß oder klein zu Klein: A -> a, a -> a.
Somit muss man nur für Kleinbuchstaben testen
Ob man hier eine Loop oder Rekursion verwendet, wird keinen Unterschied machen