web-dev-qa-db-fra.com

Pourquoi ma fonction récursive python ne renvoie-t-elle aucun?)

J'ai cette fonction qui s'appelle elle-même:

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

Maintenant, si je ne saisis que "a" ou "b", tout se passe bien:

Type "a" or "b": a
got input: a

Mais si je tape autre chose et ensuite "a" ou "b", je reçois ceci:

Type "a" or "b": purple
You didn't type "a" or "b". Try again.
Type "a" or "b": a
got input: None

Je ne sais pas pourquoi get_input() renvoie None, car il ne devrait renvoyer que my_var. D'où vient ce None et comment puis-je corriger ma fonction?

44
Cate

Il renvoie None parce que lorsque vous l'appelez de manière récursive:

if my_var != "a" and my_var != "b":
    print('You didn\'t type "a" or "b". Try again.')
    get_input()

..vous ne renvoyez pas la valeur.

Ainsi, pendant que la récursivité se produit, la valeur de retour est ignorée, puis vous perdez la fin de la fonction. Tomber à la fin de la fonction signifie que python renvoie implicitement None, juste comme ceci:

>>> def f(x):
...     pass
>>> print(f(20))
None

Ainsi, au lieu de simplement appelantget_input() dans votre instruction if, vous devez utiliser return it:

if my_var != "a" and my_var != "b":
    print('You didn\'t type "a" or "b". Try again.')
    return get_input()
64
roippi

Pour renvoyer une valeur autre que None, vous devez utiliser une instruction return.

Dans votre cas, le bloc if n'exécute qu'un retour lors de l'exécution d'une branche. Déplacez le retour en dehors du bloc if/else ou utilisez les retours dans les deux options.

7
Simon
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.')
        return get_input()
    else:
        return my_var

print('got input:', get_input())
2
user6348168