Python - Problem wie ich eine falsche Eingabe abfangen kann?

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.

christianistcoo  21.12.2020, 15:40

Ob man hier eine Loop oder Rekursion verwendet, wird keinen Unterschied machen

0
alfredo153  21.12.2020, 15:41
@christianistcoo

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.

0
christianistcoo  21.12.2020, 15:43
@alfredo153

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

0
DNSxxx 
Fragesteller
 21.12.2020, 15:46

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?

0
christianistcoo  21.12.2020, 16:34
@DNSxxx

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()
1

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()
DNSxxx 
Fragesteller
 21.12.2020, 16:54

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.

1
christianistcoo  21.12.2020, 16:55
@DNSxxx

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

1
Theodor951Ernst  29.03.2021, 18:19
@DNSxxx

na, weil die variable frage und die Funktion Frage gleich heißen. deshalb wird nach frage=input(...) es keine Funktion frage(9 mehr geben.

0

Du redefinierst frage als Variable und willst es dann wieder callen.
Solltest den input in eine andere Variable bspw: frage_inp speichern

DNSxxx 
Fragesteller
 21.12.2020, 16:29

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?

0
Theodor951Ernst  29.03.2021, 18:22
@DNSxxx

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()

?

0
christianistcoo  06.04.2021, 03:21
@Theodor951Ernst

Es kovertiert jeden Charakter, egal ob groß oder klein zu Klein: A -> a, a -> a.
Somit muss man nur für Kleinbuchstaben testen

1