Why does my recursive function return None?

Question:

I have this function that calls itself:

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

Now, if I input just “a” or “b”, everything works fine:

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

But, if I type something else and then “a” or “b”, I get this:

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

I don’t know why get_input() is returning None since it should only return my_var. Where is this None coming from and how do I fix my function?

Asked By: Cate

||

Answers:

It is returning None because when you recursively call it:

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

..you don’t return the value.

So while the recursion does happen, the return value gets discarded, and then you fall off the end of the function. Falling off the end of the function means that python implicitly returns None, just like this:

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

So, instead of just calling get_input() in your if statement, you need to return what the recursive call returns:

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

To return a value other than None, you need to use a return statement.

In your case, the if block only executes a return when executing one branch. Either move the return outside of the if/else block, or have returns in both options.

Answered By: 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())
Answered By: user6348168

i think this code more clearly

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()
Answered By: Oğuzhan Çetinkaya
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.