У меня есть эта функция, которая вызывает саму себя:
defget_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, точно так же, как это:
>>> deff(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
defget_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 была бы полезна для разъяснения процесса выполнения рекурсивной функции.