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

在Python 3.4.2中将函数用作另一个函数的参数,python,function,python-3.x,methods,python-idle,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

为了更好地掌握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”以外的任何内容时,它们将被带到试图退出的函数的开头。不过,当前发生的情况是,一旦输入了instruction()的print语句,它就会无限重复

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


谢谢

您在错误的位置使用了括号。编写
instruction()
时,调用
instruction()
。当你调用一个函数时,它的参数在被调用之前被求值。因此,当您执行
backToMain(instruction())
时,它必须调用
instruction()
,以便将其返回值作为参数传递,这意味着它再次调用
instruction
,后者再次调用它,等等

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

backToMain
中,您遇到了相反的问题。最后,您需要执行
f()
f
本身只是对函数的引用,而不是调用,因此它不会做任何事情。要调用函数,需要使用括号;要传递函数对象,不需要使用括号


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

请修复代码中的缩进。感谢@BrenBarn,它已修复。虽然代码在实际脚本中正确缩进,但缩进不是问题所在。谢谢,这正是问题所在。现在,请原谅我的无知,但是这种技术如何创建递归调用呢?此外,像在while循环中粘贴当前代码这样简单的方法能解决这个问题吗?@ryanhagz:假设您调用
instruction
。然后调用
backToMain
。如果用户输入无效输入,将再次调用
指令
。这是一个递归调用(尽管是间接的)。此外,如果用户从
main menu
中做出一些选择,然后以某种方式返回
backToMain
并点击b,则将再次调用
main menu
。基本上,每次用户执行某项操作时,您都会重新调用关联函数,而不是返回到已调用的函数调用。