从递归Python函数返回值

时间:2020-10-10 15:52:46

标签: python function recursion

编辑:我应该事先说过,我知道这不是最好的方法;我专门尝试使用递归对此进行了解。

我是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)”的第一个变量都将成为返回的值。

非常感谢您的帮助!

4 个答案:

答案 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)

您的代码显然不起作用

  • 发出错误消息
  • 重复获取新输入...并忽略任何返回值
  • 返回使您打印错误消息的 local 值。

在递归情况下,您将采用从递归调用中获得的值,并将其传递回调用堆栈。

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

嗨。 它会解决您的问题, 我只是在代码中编辑内容。 只需自己修复缩进即可。 祝你好运!