重温Python 3中的函数

重温Python 3中的函数,python,function,memory,python-3.x,Python,Function,Memory,Python 3.x,在我的脚本中,有四个函数如下所示: def function_four(): # Does Stuff function_one() def function_three(): # Does Stuff function_two() def function_one(): usr_input = input("Options: '1') function_three | '2') Quit\nOption: ") if usr_input =

在我的脚本中,有四个函数如下所示:

def function_four():
    # Does Stuff
    function_one()

def function_three():
    # Does Stuff
    function_two()

def function_one(): 
    usr_input = input("Options: '1') function_three | '2') Quit\nOption: ")
    if usr_input == '1':
        function_three()
    elif usr_input == '2':
        sys.exit()
    else:
        print("Did not recognise command. Try again.")
        function_one()

def function_two():
    usr_input = input("Options: '1') function_four | '2') function_three | '3') Quit\nOption: ")
    if usr_input == '1':
        function_four()
    elif usr_input == '2':
        function_three()
    elif usr_input == '3':
        sys.exit()
    else:
        print("Did not recognise command. Try again.")  
function_one()

我需要知道这是否会导致问题,我想它会:函数永远不会关闭,导致许多打开的函数,可能会浪费内存,最终会出现减速,直到用户退出脚本才会消失。如果是真的,那么这很可能是不好的做法和不可取的做法,这意味着必须有一个替代方案?

只要您有以下Python代码:

调用相同的函数,以便如果用户没有选择其他语句之一,则可以重试,而不是让程序停止工作

用循环替换递归调用几乎总是更好的。在这种情况下,递归是完全不必要的,可能会浪费资源,并可能使代码更难遵循

编辑:既然您已经发布了代码,我建议将其重新编译为一个。以下页面提供了可能有用的Python模块的摘要:

即使没有任何附加模块,您的代码也可以进行简单的非递归重写:

import sys

def function_four():
    # Does Stuff
    return function_one

def function_three():
    # Does Stuff
    return function_two

def function_one():
    usr_input = input("Options: '1') function_three | '2') Quit\nOption: ")
    if usr_input == '1':
        return function_three
    elif usr_input == '2':
        return None
    else:
        print("Did not recognise command. Try again.")
        return function_one

def function_two():
    usr_input = input("Options: '1') function_four | '2') function_three | '3') Quit\nOption: ")
    if usr_input == '1':
        return function_four
    elif usr_input == '2':
        return function_three
    elif usr_input == '3':
        return None
    else:
        print("Did not recognise command. Try again.")
        return function_two

state = function_one
while state is not None:
    state = state()

请注意,这些函数不再相互调用。相反,它们都返回下一个要调用的函数,顶级循环负责调用。

我们能看到代码而不是口头描述吗?还有,函数三和函数四的意义是什么?@tzaman。除了简单地调用其他函数之外,还有其他一些事情正在进行,但它们对这个问题并不重要,因此为了简单起见,我将它们忽略了。这段代码刚刚使我的Python 3.2崩溃——我不是指运行时异常,我指的是真正的崩溃——出现了一个致命的Python错误:无法从堆栈溢出中恢复。中止陷阱消息。不可否认,我不得不按住返回键一分钟,但仍然如此。@Eden:你可以回答你的问题,并直接用你的代码替换你的varbal描述。真正的代码比它的描述更容易理解。我为你编辑了这个问题Rik Poggi。扎曼:最后一行在我的链接中没有正确对齐,应该在最左边,详细信息请参见问题。DSM:奇怪。对我有用。include sys是sys.exit所必需的,但除此之外,我不知道问题出在哪里。此外,每当你遇到类似的问题时,你最好看看英语中大写和小写的用法。另外,当您有一种支持尾部调用优化的语言时,这就不适用了true@NiklasB.当前位置关于学习正确地大写事物,单词English用大写字母E拼写。至于尾部递归,这是一个关于Python的问题,如果没有这个最小的注释大小,我会回答Touché。一定错过了[python]标记,因为在aix建议的o.OThanks问题中没有python代码,即使它没有回答我的问题。@EdenCrow:不确定您是否看过我的编辑,但我建议您将代码重写为简单的状态机。