关于良好做法的初学者问题。
以这段代码为例。我想要一个特定的用户输入,如果他们输入一些疯狂的东西,我显然想再次在函数内部运行代码。
def get_difficulty():
chosen_difficulty = str(raw_input("*** Choose difficulty: Easy, Medium or Hard: ").lower())
if chosen_difficulty == "hard":
return 10
elif chosen_difficulty == "medium":
return 15
elif chosen_difficulty == "easy":
return 20
else:
print "*** Did you enter 'Easy', 'Medium' or 'Hard'?"
print "*** Sorry that was passive aggressive. You obviously didn't..."
return get_difficulty()
是否可以让函数像这样处理其他情况?它似乎不优雅;如果这个人输入了错误五次,那么这个函数将被嵌套5次,最终正确的答案必须通过返回每个函数来降级。
它工作正常,但是有更好的方法吗?
答案 0 :(得分:3)
在你的情况下,循环是处理重复输入的正确方法:
def get_difficulty():
while True:
chosen_difficulty = raw_input("*** Choose difficulty: Easy, Medium or Hard: ").lower()
try:
return {"hard": 10, "medium": 15, "easy": 20}[chosen_difficulty]
except KeyError:
print "*** Did you enter 'Easy', 'Medium' or 'Hard'?"
print "*** Sorry that was passive aggressive. You obviously didn't..."
答案 1 :(得分:0)
您发现的内容称为"递归"而且根本没有错。这是一个强大的概念,往往导致优雅的问题形式。 Fibonacci数是一个经常出现的问题,可以通过递归轻松解决:我们想要生成数字序列1,1,2,3,5,8,13 ......所以n+1
条目是(n- 1)+(n)。这导致以下算法:
def fibonacci(n):
"""Generate the n-th fibonacci number"""
if n == 0 or n == 1:
return(1)
else:
return(fibonacci(n-2) + fibonacci(n-1))
每个递归函数都可以变成迭代函数。对于第n个斐波那契序列,存在一个封闭的形式,你可以查找in the wikipedia article。如你所见,有两个"无理数"这可以用两个平方根的和/除来表示。因此,有时问题是“自然递归”#34;并且递归解决方案可能很短,因为迭代解决方案可能看起来很丑陋" /"更长"。
所以递归通常是一件好事,但在python中它并不总是一个好的解决方案。正如您已经指出的,如果用户插入错误输入五次,则函数堆栈将有五个函数调用。 Python具有最大重复深度,如果用户连续输入错误输入,则可能导致程序崩溃。在用户输入的情况下,这不是一个问题,但在其他情况下,您可以更轻松地运行到最大递归深度。
尾递归(在python中没有实现)是一种允许任意递归深度的方法。 Haskell和lisp使用此概念,您可以在wikipedia或this stackoverflow post上阅读更多内容。
在python中处理输入验证的规范方法是由Daniel指出的while循环。