我是一个蟒蛇初学者,我在功能编程的概念上挣扎。我简直无法理解为什么甚至会调用嵌套函数(见下面的例子)。这很难解释。
func3 = func1(func2)
在这里,我使用位置参数func1
调用func2
。一切都很公平。 func1
返回嵌套函数。但是当我运行代码时,函数nest1
已被执行,即使我只调用了func1
(我不明白为什么这应该执行嵌套函数)。 func1
不应该做什么,而不是在没有打印任何东西的情况下返回函数。谁可以给我解释一下这个?
def func2():
def nest2():
print('Nest2')
nest2()
return nest2
def func1(func):
def nest1():
print('Nest1')
func()
return nest1
func3 = func1(func2)
func3()
如果我用嵌套函数调用一个简单函数,则不执行内部函数。见下文:
def new_func():
def inner():
print(1)
return inner
new_func()
答案 0 :(得分:2)
func1()
返回方法nest1
(不执行),因此您的调用func3 = func1(func2)
会返回nest1
并将其分配给func3
。
您正在执行分配给func3
的任何内容的下一行 - 这是方法nest1
。换句话说,行func3()
正在执行函数nest1
,并导致文本打印。
答案 1 :(得分:1)
但是当我运行代码时,函数nest1已被执行,即使我只调用了func1(我不明白为什么这应该执行嵌套函数)。 Func 1不应该做的不仅仅是返回一个函数而不打印任何东西。有人可以向我解释一下吗?
执行此操作时:
func3 = func1(func2)
您将函数func2
传递给函数func1
。在func1
内部,您定义了一个函数nest1
,它调用传入的函数。然后返回此函数并成为func3
的值。 func1
唯一能做的就是创建nest1
函数,并将其返回。调用func3
时,您实际上调用了func1
,nest1
内定义的函数。
如果我用嵌套函数调用一个简单函数,则不执行内部函数。
您的第二个示例未按预期工作的原因是因为调用new_func
未调用inner
,只有创建 inner
并将其返回。这与上述情况相同。致电func1
时未调用nest1
,它只是创建nest1
并将其返回。您必须明确地拨打nest1
(func3()
)。同样,您需要显式调用从new_func
返回的函数:
new_func()()
答案 2 :(得分:0)
在最后一个示例中,您需要使用额外的()
调用正在返回的函数:
def new_func():
def inner():
print(1)
return inner
new_func()()
输出:
1
答案 3 :(得分:0)
func2
的正文是:
def nest2():
print('Nest2')
nest2()
return nest2
所以func1(func2)
的身体是:
print('Nest1')
def nest2():
print('Nest2')
nest2()
return nest2
我们在func
正文中将func2
替换为nest1
的正文时获得的最后一篇文章。