python if-else递归函数返回不需要的值

时间:2019-02-12 12:34:26

标签: python python-2.7 function if-statement return

我在这里面临条件逻辑问题。

我想从用户那里得到一个值,但只能将其限制在其中一个

'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

在python控制台中检查inp:-

>> 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 :(得分:2)

递归调用函数时,您忘记返回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

答案 1 :(得分:1)

尝试一下。

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

答案 2 :(得分:0)

我个人对此:-

   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")

确保它需要循环而不是递归,并且效率较低。但是,如果要通过不回溯来节省内存,请尝试此操作。