web-dev-qa-db-ja.com

再帰python関数が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はどこから来て、どのように関数を修正しますか?

44
Cate

再帰的に呼び出すと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
_

したがって、ifステートメントでcallingget_input()だけでなく、return itにする必要があります。

_if my_var != "a" and my_var != "b":
    print('You didn\'t type "a" or "b". Try again.')
    return get_input()
_
64
roippi

None以外の値を返すには、returnステートメントを使用する必要があります。

あなたの場合、ifブロックは1つのブランチを実行するときにのみリターンを実行します。リターンをif/elseブロックの外側に移動するか、両方のオプションにリターンを設定します。

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