88 votes

Pourquoi ma fonction récursive renvoie-t-elle None ?

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 saisis juste "a" ou "b", tout fonctionne bien :

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

Mais si je tape autre chose et ensuite "a" ou "b", j'obtiens 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() est de retour None puisqu'il ne devrait retourner que my_var . Où se trouve cette None et comment puis-je réparer ma fonction ?

125voto

roippi Points 14363

Il revient None parce que lorsque vous l'appelez récursivement :

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

vous ne retournez pas la valeur.

Ainsi, pendant que la récursion se produit, la valeur de retour est rejetée, et vous tombez à la fin de la fonction. Tomber à la fin de la fonction signifie que python retourne implicitement None comme ça :

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

Donc, au lieu de simplement en appelant get_input() dans votre if vous devez return il :

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

12voto

Simon Points 121

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

Dans votre cas, le bloc if n'exécute un retour que lors de l'exécution d'une branche. Soit vous déplacez le retour en dehors du bloc if/else, soit vous avez des retours dans les deux options.

2voto

user6348168 Points 45
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())

0voto

Je pense que ce code est plus clair

def get_input():
    my_var = str(input('Enter "a" or "b": '))
    if my_var == "a" or my_var == "b":
        print('got input:', my_var)
        return my_var
    else:
        print('You didn\'t type "a" or "b". Try again.')
        return get_input()
get_input()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X