繁体   English   中英

从递归返回值 Python Function

[英]Returning a Value from a Recursive Python Function

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

我是 Python 的新手,具有编程的初学者知识,我遇到了递归和错误处理的问题。 我有这个 function 需要用户输入来为我的程序获取变量:

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 之间的数字,则返回该值。 我遇到了以下问题:

如果我输入所有整数,则只返回第一个值:

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)' 的第一个变量都会成为返回的变量。

任何帮助深表感谢!

您也需要显式返回内部递归调用值。 在 function 的最后一行使用return get_seconds()而不是get_seconds()

请参阅Wasif 的回答,了解为什么您的代码不起作用 - 您的代码不会在所有代码路径上返回值。

对这个任务使用递归是不好的,使用一个简单的循环并从中中断/返回:

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

您可以在询问用户输入直到他们给出有效响应中找到更多相关信息

你在几个层面上都有问题。 过程问题是您编写了一个四叶子例程而没有测试各个代码块。 结构性问题是您使用递归来完成更适合简单迭代的工作。 请参阅迭代直到有效输入

功能性问题是您返回值的唯一时间是从调用的顶层:

print("Interval must be between 1 and 60.")
get_seconds()
return(int_a)

您此处的代码显然功能失调

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

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

print('error')
return(get_seconds())
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())

你好。 它会解决你的问题,我只是在代码中编辑一些东西。 自己修复缩进。 祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM