87

私は自分自身を呼び出すこの関数を持っています:

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()返されるのかわかりません。これはどこから来て、どうすれば機能を修正できますか?Nonemy_varNone

4

4 に答える 4

124

再帰的に呼び出すと、次のように返さ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()ifreturn

if my_var != "a" and my_var != "b":
    print('You didn\'t type "a" or "b". Try again.')
    return get_input()
于 2013-07-22T00:31:19.583 に答える
12

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

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

于 2013-07-22T00:32:48.573 に答える
-1

このコードはより明確だと思います

def get_input():
    my_var = str(input('Enter "a" or "b": '))
    if my_var == "a" or my_var == "b":
        print('got input:', my_var)
        return my_var
    else:
        print('You didn\'t type "a" or "b". Try again.')
        return get_input()
get_input()
于 2020-07-10T13:09:16.230 に答える