Warum funktioniert mein rekursive python-Funktion zurückzukehren Keiner?
Habe ich diese Funktion, die nennt sich:
def get_input():
my_var = input('Enter "a" or "b": ')
if my_var != "a" and my_var != "b":
print('You didn\'t type "a" or "b". Try again.')
get_input()
else:
return my_var
print('got input:', get_input())
Nun, wenn ich geben Sie nur "a" oder "b" funktioniert alles wunderbar:
Type "a" or "b": a
got input: a
Aber, wenn ich etwas anderes eingibst und dann "a" oder "b", bekomme ich diese:
Type "a" or "b": purple
You didn't type "a" or "b". Try again.
Type "a" or "b": a
got input: None
Ich weiß nicht, warum get_input()
zurück None
, da sollte es nur zurück my_var
. Wo ist dieser None
herkommt, und wie behebe ich meine Funktion?
- Sie tun müssen
return Dat_Function()
beim Aufruf rekursiv. - Nur ein Tipp: Die idiomatische Weise, dass
my_var != "a" and my_var != "b"
Zustand wäremy_var not in ('a', 'b')
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist wieder
None
weil, wenn Sie rekursiv nennen es:..Sie nicht den Rückgabewert.
So, während der Rekursion geschieht, ist der Rückgabewert wird verworfen, und dann fallen Sie ab Ende der Funktion. Fallen aus dem Ende der Funktion bedeutet, dass python implizit zurück
None
, genau wie dieser:So, statt nur aufrufen
get_input()
in Ihremif
Anweisung die Sie brauchen, umreturn
es:main()
?main()
bisschen... Sie können scheitern, so oft wie Sie wollen, die eine, die "erfolgreich" zurückmy_var
, die bekommen weitergegeben (return
ed) durch alle rekursiven Aufrufe den ganzen Weg hinunter zu den ursprünglichen Aufrufer. Die, ja, istmain()
.return Dat_Function()
du bist wirklich nur zum telefonierenDat_Function()
wieder inmain()
.Dat_Function()
gibt jetzt eine Funktion, undmain()
hat geh, Ruf es.Rückgabe einen anderen Wert als "None" verwenden, benötigen Sie eine return-Anweisung.
In Ihrem Fall der if-block nur ausgeführt wird, zurück, wenn die Ausführung einer Verzweigung. Entweder verschieben Sie die Rückgabe außerhalb der if/else-block, oder haben die Renditen in den beiden Optionen.
Ich denke, dass Sie verwenden sollten while-Schleifen.
Betrachten, die Sie geben etwas anderes als "a" und "b", natürlich, es rufen
get_input
aber es ist dann überspringen Sie den nächsten Teil. Das ist:Und gehen direkt in:
So, wenn Sie while-Schleife wie:
Diese Weise, denke ich, dass Sie damit umgehen können.