рекурсивная функция python if-else возвращает нежелательное значение - PullRequest
0 голосов
/ 12 февраля 2019

Здесь я сталкиваюсь с проблемой условной логики.

Я хочу получить значение от пользователя, но оно должно быть ограничено либо

'ABC','DEF' or'XYZ'

Если не предоставляется ни с одним извыше, программа должна дать пользователю еще один шанс войти, пока он не получит ввод только из ожидаемых значений

Мой фрагмент выглядит следующим образом: -

def foo():
    inp_val=raw_input("Enter value\n>> ")
    if inp_val.upper() not in {'ABC','DEF','XYZ'}:
        print("Invalid Input")
        foo()
    return inp_val
inp = foo()

Вывод

Enter value
>> 42342d*@r2
Invalid Input
Enter value
>> abc

Проверка inp в консоли Python: -

>> inp
ABC #(Expected)
42342d*@r2 #(Actual)

Почему это происходит?

Я тоже попробовал обратную логику: -

def bar():
    inp_val=raw_input("Enter value\n>> ")
    if inp_val.upper() in {'ABC','DEF','XYZ'}:
        return inp_val
    else:
        print("invalid input")
        bar()
inp = bar()

Вывод:

Enter value
>> 42342d*@r2
Invalid Input
Enter value
>> abc

В консоли:

>> inp
ABC #Expected
    #(Actual)

Как получить фактическое значение?

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Попробуйте это.

    def foo():
            inp_val=input("Enter value\n>> ")
            if inp_val.upper() not in {'ABC','DEF','XYZ'}:
                    print("Invalid Input")
                    return foo()
            else:
                    return inp_val

    inp = foo()
0 голосов
/ 12 февраля 2019

Мой собственный взгляд на это: -

   def bar():
        temp = True
        while temp:
            inp_val = raw_input("Enter value\n>> ")
            if inp_val.upper() in {'ABC','DEF','XYZ'}:
                temp = False
                return inp_val
            else:
                print("invalid input")

Конечно, он требует циклов, а не рекурсии, и менее эффективен.Но если вы хотите сохранить память, не возвращаясь назад, попробуйте это.

0 голосов
/ 12 февраля 2019

Вы забыли вернуть foo () при рекурсивном вызове вашей функции.

 #!/usr/bin/python

   def foo():
       inp_val=raw_input("Enter value\n>> ")
       if inp_val.upper() not in {'ABC','DEF','XYZ'}:
           print("Invalid Input")
           return foo()
       return inp_val
   inp = foo()
   print(inp)

Эффект:

~/sandbox » python a.py                                                                                                                                                                                          tracma01@londev1tracma01
Enter value
>> f
Invalid Input
Enter value
>> ABC
ABC
...