it-swarm.dev

لماذا تعيد وظيفتي العودية python دالة لا شيء؟

لدي هذه الوظيفة التي تطلق على نفسها:

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

لكن إذا كتبت شيئًا آخر ثم "أ" أو "ب" ، سأحصل على هذا:

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

لذا ، بدلاً من فقط استدعاء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()
64
roippi

لإرجاع قيمة غير "بلا" ، تحتاج إلى استخدام جملة الإرجاع.

في الحالة الخاصة بك ، كتلة if تنفذ فقط عائد عند تنفيذ فرع واحد. إما أن تنقل الإرجاع خارج كتلة 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