装饰功能

时间:2017-09-11 14:00:16

标签: python

我是一个蟒蛇初学者,我在功能编程的概念上挣扎。我简直无法理解为什么甚至会调用嵌套函数(见下面的例子)。这很难解释。

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()

4 个答案:

答案 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时,您实际上调用了func1nest1内定义的函数。

  

如果我用嵌套函数调用一个简单函数,则不执行内部函数。

您的第二个示例未按预期工作的原因是因为调用new_func未调用inner,只有创建 inner并将其返回。这与上述情况相同。致电func1时未调用nest1,它只是创建nest1并将其返回。您必须明确地拨打nest1func3())。同样,您需要显式调用从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的正文时获得的最后一篇文章。