Python未返回预期值

1 投票
3 回答
564 浏览
提问于 2025-04-17 06:40

我实在搞不懂这里发生了什么。这个问题对我的作业很重要(我在学习编程,所以还是个初学者……而且我的英语也不太好,抱歉)。

我正在尝试读取一个字符串……它可以是一个数字,也可以是一组特定的命令。
我就给个很小的例子,说明我想做什么以及哪里出错了。

    def validate():
        choice = str(input(">>> "))
        if (choice == "exit"):
            return 0 # should exit validate
        else:
            try:
                aux = int(choice) # Tries converting to integer
            except:
                print("Insert integer or exit")
                validate() # If it can't convert, prompts me to try again through
                           # recursivity
            else:
                return aux
    rezult = validate()
    print (rezult)

问题是这个小脚本返回的结果完全是随机的。

如果输入是“exit”,它返回“None”。
如果第一个输入是正确的,它会返回正确的数字。
如果第一个输入是“错误”,而第二个输入是正确的,它又返回“None”,我就是搞不懂哪里出了问题……为什么它不想工作,或者我应该怎么做(或者说,替代方案)。

3 个回答

1

好的,我决定听取建议,把递归的部分改成了循环,感谢你的帮助。(现在可以用了)

     def validateChoice():
         condition = False
         while (condition == False):
             choice = str (input (">>> "))
             if (choice == "exit"):
                 return 0
             else:
                 try:
                     aux = int (choice)
                 except:
                     print ("Insert integer or 'exit'")
                 else:
                     condition = True
        return aux
3

在使用Python时,如果你不是在用Python 3.x版本,就用raw_input代替input

choice = raw_input(">>> ")

另外,你这里缺少一个返回值。

        except:
            print ("Insert integer or exit")
            return validate () # <<< here

还有,不要用递归来解决这个问题,改用循环会更好。

6

如果你进入了except这个代码块,函数validate()会用一种叫做递归调用的方法来再次调用自己。当这个调用结束后,它会回到最开始调用它的地方,也就是except代码块里。此时,validate()的返回值会被忽略,控制权会直接到达外层调用的结尾,而没有遇到return语句,所以会隐式返回None

在这里不要使用递归,应该用循环。

撰写回答