【发布时间】:2017-02-13 08:22:58
【问题描述】:
我在 Python 方面相当有经验,但是当我帮助一位朋友编写脚本时,我注意到他以不同于我熟悉的方式解决了一个常见问题。他确保用户输入的格式有效(浮点数);我已经习惯了看到这样的事情,这也是我能找到的所有答案所说的:
def get_input()
while True:
try:
val = float(input("input pls"))
return val
except:
print("not valid, try again)
然而,他使用递归解决了这个问题,如下所示:
def get_input():
try:
val = float(input("input pls"))
return val
except:
print("not valid, try again")
return get_input()
这有什么缺点吗?
【问题讨论】:
-
嗯,这可能与这个特定的用例无关,但在 python 中有一个最大的递归深度。这两个版本都受到了一个赤裸裸的
except子句的影响,不过...... -
比较两组代码。问问自己递归版本是否更易于阅读和支持。如果不是,那么保持堆栈状态是不必要的开销。递归只有在简化时才值得。
-
与大多数编译语言不同,Python 无法优化递归。它还规定了最大递归深度(默认为 1000)以阻止失控函数消耗所有 RAM。因此,如果可以使用像
while循环这样的简单替代方法,则应避免 Python 中的递归。当然,如果递归适用于问题领域,例如处理递归结构,如树,那么一定要使用它。 -
@juanpa.arrivillaga:我知道有一个最大深度,但在这里并没有真正看到它的相关性。另外,我知道
except是赤裸裸的,我只是输入了一些简短的sn-ps 来演示这个案例。编辑:没关系,我知道它是如何相关的,因为每个输入都会创建一个新堆栈。 @cdarke:我个人认为递归版本看起来更干净,这就是为什么我要问它是否有任何缺点,因为我更习惯于看到循环版本。
标签: python validation recursion input