J'ai une fonction récursive qui s'appelle elle-même jusqu'à ce qu'elle obtienne la bonne entrée.
def input_something(prompt = ""):
playerInput = input(prompt)
if playerInput == "":
print("Error: No input")
input_something(prompt)
elif not playerInput.isspace():
return playerInput
else:
print("Error: Incorrect input")
input_something(prompt)
while True:
print("Input Value")
inp = input_something("> ")
print(type(inp))
print(inp)
print("\n")
La fonction fonctionne très bien si vous lui donnez une valeur normale mais elle se brise si vous lui donnez d'abord une chaîne vide, puis un caractère / une chaîne. Au lieu de sortir la chaîne comme prévu, il donne un type None.
Quelqu'un peut-il expliquer cela?
3 Réponses :
Vous devez renvoyer le résultat de l'appel récursif:
def input_something(prompt = ""):
playerInput = input(prompt)
if playerInput == "":
print("Error: No input")
return input_something(prompt)
elif not playerInput.isspace():
return playerInput
else:
print("Error: Incorrect input")
return input_something(prompt)
Sinon, la fonction appelée récursivement s'exécutera mais sa valeur de retour sera supprimée. Notez que votre fonction d'origine ne retourne pas dans deux des trois branches. En Python, ne rien renvoyer signifie que la valeur renvoyée est Aucun.
Pouvez-vous expliquer pourquoi cela fonctionne?
J'ai essayé de l'expliquer un peu, jetez un œil à la réponse mise à jour.
Changer la fonction input_something en:
def input_something(prompt = ""):
playerInput = input(prompt)
if playerInput == "":
print("Error: No input")
return input_something(prompt)
elif not playerInput.isspace():
return playerInput
else:
print("Error: Incorrect input")
return input_something(prompt)
Cela résout le problème.
C'est parce que lorsque le code entre pour la première fois dans la fonction et que nous entrons autre chose qu'une entrée correcte, il ne renvoie jamais une valeur à la boucle while.
Si j'entre "" puis "hello", la chaîne correcte "hello" sera renvoyée à la première itération de input_something et NON à la boucle while, alors puisque nous le faisons rien avec cette valeur, la fonction se ferme simplement sans changer la variable playerInput en la chaîne correcte "bonjour".
Le code affiché se termine par une boucle récursive infinie, quelle que soit la valeur correcte. Si votre intention est de vérifier récursivement jusqu'à ce que l'entrée correcte soit fournie, le code suivant fera l'affaire:
def input_something(prompt = ""):
playerInput = input(prompt)
while True:
if playerInput == "":
print("Error: No input")
return input_something(prompt)
elif not playerInput.isspace():
return playerInput
else:
print("Error: Incorrect input")
return input_something(prompt)
inp = input_something("> ")
print(inp)
Vous avez également besoin d'un
retoursur les appels récursifs!