在Python 3.4.2中使用函数作为另一个函数的参数

时间:2014-10-19 23:25:34

标签: python function python-3.x methods python-idle

我正在研究一个简单的想法,以便更好地掌握Python。我虽然遇到了麻烦。

这是我的代码:

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”之外的任何内容时,它们将被带到他们试图退出的功能。目前发生的事情是,一旦你输入instruct()的print语句就会重复无限。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

您在错误的地方使用括号。当您撰写instruct()时,请致电instruct()。调用函数时,在调用函数之前会对其参数进行求值。因此,当您执行backToMain(instruct())时,必须调用instruct()以将其返回值作为参数传递,这意味着它再次调用instruct,再次调用它等等。

要传递函数本身(而不是其返回值),请执行backToMain(instruct)

backToMain你有相反的问题。最后,您需要f()f本身只是对函数的引用,而不是调用,因此它不会执行任何操作。要调用函数,您需要使用括号;传递你不需要使用括号的函数对象。

那就是说,这不是一个很好的方法。它创建了许多递归调用。如果用户输入了大量无效输入,他可能会达到递归限制。如果不了解程序的整体结构,很难说它有多好,但总的来说,最好避免递归作为一种“重新开始”的技术;你应该选择一个循环。