编辑:我应该事先说过,我知道这不是最好的方法;我专门尝试使用递归对此进行了解。
我是Python的新手,具有编程的初学者知识,并且遇到了递归和错误处理的问题。我有一个需要用户输入才能为我的程序获取变量的函数:
1 def get_seconds():
2 a = input("Run how often in seconds (1-60, q to Quit)? ")
3 if a.lower() == "q":
4 exit()
5 try:
6 int_a = int(a)
7 if int_a < 1 or int_a > 60:
8 print("Interval must be between 1 and 60.")
9 get_seconds()
10 return(int_a)
11 else:
12 return(int_a)
13 except:
14 print("Interval must be an integer between 1 and 60.")
15 get_seconds()
16
17 c = get_seconds()
18 print(c)
这个想法是,如果用户输入Q或q,它将立即退出。如果用户输入的数字介于1到60之间(含1和60),则返回该值。不过,我遇到了以下问题:
如果我输入所有整数,则仅返回第一个值:
Run how often in seconds (1-60, q to Quit)? 99
Interval must be between 1 and 60.
Run how often in seconds (1-60, q to Quit)? -20
Interval must be between 1 and 60.
Run how often in seconds (1-60, q to Quit)? 5
99
如果我使用其他导致int_a = int(a)
失败的数据类型,则返回None:
Run how often in seconds (1-60, q to Quit)? 5555.9999
Interval must be an integer between 1 and 60.
Run how often in seconds (1-60, q to Quit)? -5
Interval must be between 1 and 60.
Run how often in seconds (1-60, q to Quit)? 5
None
我无法通过它跟踪变量的内容。基本上,无论递归如何,通过“ int_a = int(a)”的第一个变量都将成为返回的值。
非常感谢您的帮助!
答案 0 :(得分:4)
您还需要显式返回内部递归调用值。在函数的最后一行中,使用return get_seconds()
代替get_seconds()
答案 1 :(得分:3)
请参阅Wasif's answer,了解为什么您的代码不起作用-您的代码未在所有代码路径上返回值。
为此任务使用递归是不好的,请使用简单的循环并从中断开/返回:
def get_seconds():
while True:
a = input("Run how often in seconds (1-60, q to Quit)? ")
if a.lower() == "q":
exit()
try:
int_a = int(a)
if 1 <= int_a <= 60: # return if valid, this leaves the while loop
return int_a
except ValueError: # catch specific errors
print("Interval must be an integer between 1 and 60.")
c = get_seconds()
您可以在Asking the user for input until they give a valid response
中找到更多信息答案 2 :(得分:1)
您在多个层面上都有问题。 process 问题是您编写了一个四叶的子例程,而没有测试各个代码块。 structural 问题是您正在使用递归来完成更适合简单迭代的工作。参见iterate until valid input。
功能问题是,您返回值的唯一时间是从顶级调用开始:
print("Interval must be between 1 and 60.")
get_seconds()
return(int_a)
您的代码显然不起作用
在递归情况下,您将采用从递归调用中获得的值,并将其传递回调用堆栈。
print('error')
return(get_seconds())
答案 3 :(得分:0)
def get_seconds():
a = input("Run how often in seconds (1-60, q to Quit)? ")
if a.lower() == "q":
exit()
try:
int_a = int(a)
if 1 <= int_a <= 60:
print(int_a)
exit()
else:
print('Interval must be between 1 and 60.')
get_seconds()
except ValueError:
print("Interval must be an integer between 1 and 60.")
get_seconds()
c = get_seconds()
print(get_seconds())
嗨。 它会解决您的问题, 我只是在代码中编辑内容。 只需自己修复缩进即可。 祝你好运!