Вопрос-Ответ

Why does my recursive function return None?

Почему моя рекурсивная функция возвращает None?

У меня есть эта функция, которая вызывает саму себя:

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

Теперь, если я ввожу только "a" или "b", все работает нормально:

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

Но, если я наберу что-то еще, а затем "a" или "b", я получу это:

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

Я не знаю, почему get_input() возвращаетсяNone, поскольку он должен возвращать только my_var. Откуда это None берется и как мне исправить мою функцию?

Переведено автоматически
Ответ 1

Она возвращается None потому что, когда вы рекурсивно вызываете ее:

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

.. вы не возвращаете значение.

Итак, пока рекурсия происходит, возвращаемое значение отбрасывается, и затем вы переходите к концу функции. Переход к концу функции означает, что python неявно возвращает None, точно так же, как это:

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

Итак, вместо простого вызова get_input() в вашем if операторе вам нужно return узнать, что возвращает рекурсивный вызов:

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

Чтобы вернуть значение, отличное от None , вам нужно использовать оператор return .

В вашем случае блок if выполняет возврат только при выполнении одной ветви. Либо переместите возврат за пределы блока if / else, либо используйте возвраты в обоих вариантах.

Ответ 3
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())
Ответ 4

Я думаю, чтобы лучше понять, что на самом деле происходит в вашей рекурсивной функции, вам следует попробовать отладить свой код. Я рекомендую интересный инструмент визуализации выполнения кода, который называется Python Turor.

Я попробую этот тестовый пример для вашей рекурсивной функции и визуализирую процесс выполнения:

Сначала введите my_var как x, затем введите my_var как a.

Вы можете видеть из визуализатора отладки, что когда my_var = a он выполнит оператор return .

введите описание изображения здесь

Тогда рекурсивная функция вернет входное значение a в этой строке кода рекурсивной функции.

введите описание изображения здесь

После этого он снова перейдет к выполнению get_input() функции, которая не возвращает никакого значения, поэтому конечное значение print('got input:', get_input()) равно None.

введите описание изображения здесь

Если вы замените get_input() вызов внутри рекурсивной функции на return get_input(), он вернет my_var значение, которое есть a в этом тестовом примере.

введите описание изображения здесь

Надеюсь, что эта демонстрация с использованием инструмента визуализации отладки Python Tutorial была бы полезна для разъяснения процесса выполнения рекурсивной функции.

python function