2014-10-19 100 views
-1

我正在研究一个简单的想法,以便更好地掌握Python。虽然我遇到了麻烦。在Python中使用函数作为另一个函数的参数3.4.2

这里是我的代码:

def backToMain(f): 
    print('Back to Main Menu (B)') 
    back = input('>>>') 
    back = back.lower() 
    if back == 'b': 
     mainMenu() 
    else: 
     print('\nThat is not a valid input.\n\n') 
     f 

def instruct(): 
    instructtxt= str('INSTRUCTIONS') 
    instructlen = len(instructtxt) * 6 
    print(instructtxt.center(instructlen,'~')) 
    backToMain(instruct()) 

我试图去发生的是,这样每次用户不是在主菜单(即指令,信贷等),系统会提示他们与底部的文本“返回主菜单”,如果按下“b”键,它们将返回到mainMenu()函数中。如果不是这样,他们被告知这是不是一个有效的输入,并带回函数开始他们目前英寸

的问题是,虽然,因为我想在多个其他功能backToMain()函数,当用户在提示符下输入除'b'以外的任何内容时,它们将被带到它们试图退出的函数的开头。目前发生的事情是,一旦你进入教导()的印刷语句就重复自己无限。

有人认为他们可以帮我吗?如果我不清楚,请告诉我,我会尽力澄清。

谢谢!

+0

请修正您的代码中的缩进。 – BrenBarn 2014-10-19 23:26:02

+0

感谢@BrenBarn,它是固定的。尽管代码在实际脚本中正确缩进,但缩进并不是问题。 – ryanhagz 2014-10-19 23:34:17

回答

0

您在错误的地方使用括号。当你写instruct()时,你可以拨打instruct()。当你调用一个函数时,它的参数在被调用之前被评估。所以,当你做backToMain(instruct()),它叫instruct()为了通过它的返回值作为参数,这意味着它再次调用instruct,再次调用它,等

传递给函数本身(而不是它的返回值),请做backToMain(instruct)

backToMain你有相反的问题。最后你需要做f()f本身只是对函数的引用,而不是调用,所以它不会做任何事情。要调用一个函数,你需要使用圆括号;传递你不需要使用括号的函数对象。

这就是说,这不是一个很好的方法来做到这一点。它创建了很多递归调用。如果用户输入了很多无效的输入,他可能会遇到递归限制。很难说在不了解程序的整体结构的情况下如何更好地做到这一点,但总的来说,最好避免递归作为一种“重新开始”的技术。你应该更喜欢一个循环。

+0

谢谢,这正是问题所在。现在,请原谅无知,但这种技术如何创建递归调用?此外,像在当前循环中粘贴当前代码那样简单的问题解决了这个问题? – ryanhagz 2014-10-19 23:53:26

+0

@ryanhagz:假设你调用'instruct'。然后它调用'backToMain'。如果用户输入无效的输入,'instruct'将再次被调用。这是一个递归调用(尽管是间接的)。另外,如果用户从'mainMenu'做出了一些选择,然后以某种方式返回到'backToMain'并且击中了b,'mainMenu'将被再次调用(递归)。基本上,用户每次执行某些操作时,都会重新调用相关的函数,而不是返回已调用的函数。 – BrenBarn 2014-10-19 23:55:32

相关问题