Почему моя рекурсивная функция Python возвращает None?
У меня есть этот кусок кода, который вызывает себя:
def Dat_Function():
my_var = raw_input("Type \"a\" or \"b\": ")
if my_var != "a" and my_var != "b":
print "You didn't type \"a\" or \"b\". Try again."
print " "
Dat_Function()
else:
print my_var, "-from Dat_Function"
return my_var
def main():
print Dat_Function(), "-From main()"
main()
Теперь, если я введу только "а" или "б", все в порядке. Выход:
Type "a" or "b": a
a -from Dat_Function
a -From main()
Но если я наберу что-то еще, а затем "а" или "б", я получу это:
Type "a" or "b": purple
You didn't type "a" or "b". Try again.
Type "a" or "b": a
a -from Dat_Function
None -From main()
Я не знаю, почему Dat_Function()
возвращает None
, поскольку он должен возвращать только my_var
. Оператор print показывает, что my_var
является правильным значением, но функция по какой-то причине не возвращает это значение.
Ответы
Ответ 1
Возвращает None
, потому что когда вы рекурсивно называете это:
if my_var != "a" and my_var != "b":
print "You didn't type \"a\" or \"b\". Try again."
print " "
Dat_Function()
.. вы не возвращаете значение.
Итак, пока рекурсия произойдет, возвращаемое значение отбрасывается, а затем вы отваливаетесь от конца функции. Падение конца функции означает, что python неявно возвращает None
, как это:
>>> def f(x):
... pass
>>> print(f(20))
None
Итак, вместо простого вызова Dat Function()
в вашем выражении if
вам нужно return
его.
Ответ 2
Чтобы вернуть значение, отличное от None, вам нужно использовать оператор return.
В вашем случае блок if выполняет только возврат при выполнении одной ветки. Либо переместите return вне блока if/else, либо верните оба параметра.
Ответ 3
def Dat_Function():
my_var = raw_input("Type \"a\" or \"b\": ")
if my_var != "a" and my_var != "b":
print "You didn't type \"a\" or \"b\". Try again."
print " "
return Dat_Function()
else:
print my_var, "-from Dat_Function"
return my_var
def main():
print Dat_Function(), "-From main()"
main()
Ответ 4
Я думаю, что вы должны использовать циклы while.
if my_var! = "a" и my_var! = "b": print "Вы не набрали \" a\"или \" b\". Попробуйте еще раз." print "" return Dat_Function()
Учтите, что вы вводите что-то отличное от "a" и "b", конечно, это вызовет Dat_Function
но затем пропускает следующую часть. Который:
еще: выведите my_var, "-from Dat_Function" верните my_var
И перейдем непосредственно в:
def main(): вывести Dat_Function(), "-from main()"
Итак, если вы используете цикл while как:
my_var! = "a" и my_var! = "b": print ('вы не набрали a или b') возвращают функцию Dat_Function()
Таким образом, я думаю, что вы можете справиться с этим.