Python:在自身内部调用函数是一种好习惯吗?

时间:2015-04-06 15:13:08

标签: python function if-statement

关于良好做法的初学者问题。

以这段代码为例。我想要一个特定的用户输入,如果他们输入一些疯狂的东西,我显然想再次在函数内部运行代码。

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次,最终正确的答案必须通过返回每个函数来降级。

它工作正常,但是有更好的方法吗?

2 个答案:

答案 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使用此概念,您可以在wikipediathis stackoverflow post上阅读更多内容。

在python中处理输入验证的规范方法是由Daniel指出的while循环。

相关问题