如何让函数接收带参数的函数作为参数?解析Python代码执行逻辑
代码执行过程详细拆解
def Wrapper(func): def MyPrint(message): print('Hello ' + message) func(MyPrint) Wrapper(lambda my_print: my_print('world'))
问题
我理解函数可以接收另一个函数作为参数并通过func()调用它,但无法理解Wrapper(lambda my_print: my_print('world'))是如何调用内部函数MyPrint的?func是形参,lambda my_print: my_print('world')是对应的实参,而该实参似乎“穿透”了Wrapper内部的函数。这种模式在JavaScript中十分常见,但我对此感到困惑,希望能得到该代码执行过程的详细解释。
执行流程拆解
我们一步步捋清楚这段代码的运行逻辑:
- 传入lambda作为实参:调用
Wrapper(lambda my_print: my_print('world'))时,这个lambda函数会被赋值给Wrapper的形参func。此时func就代表这个lambda。 - 定义内部函数MyPrint:进入Wrapper函数后,首先定义了
MyPrint函数——它接收一个message参数,功能是打印Hello拼接message的结果。这一步只是完成函数定义,并没有执行它。 - 传递MyPrint给lambda:执行
func(MyPrint),也就是把刚定义的MyPrint函数作为参数,传给func(也就是那个lambda)。 - 执行lambda函数:lambda的参数
my_print现在指向MyPrint函数,所以my_print('world')等价于直接调用MyPrint('world')。 - 执行MyPrint并输出结果:
MyPrint('world')运行后,拼接字符串得到Hello world并打印。
这个模式本质是回调函数的典型用法:Wrapper内部封装了一个工具函数(MyPrint),然后把这个工具函数交给外部传入的回调(lambda),由回调来决定如何使用这个工具函数——就像这里lambda直接调用了MyPrint并传入指定参数。
内容的提问来源于stack exchange,提问作者Xin Jin
相关产品推荐
相关产品推荐

