Подтвердить что ты не робот

Почему моя рекурсивная функция 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 является правильным значением, но функция по какой-то причине не возвращает это значение.

4b9b3361

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

Таким образом, я думаю, что вы можете справиться с этим.