Python 装饰功能

Python 装饰功能,python,Python,我是一名python初学者,我很难理解函数式编程的简单概念。我根本不明白为什么会调用嵌套函数(见下面的示例)。这很难解释 func3 = func1(func2) 这里我用位置参数func2调用func1。一切都很好func1返回一个嵌套函数。但是当我运行代码时,函数nest1已经执行,即使我只调用了func1(我不明白为什么要执行嵌套函数)func1只能在不打印任何内容的情况下返回函数。有人能给我解释一下吗 def func2(): def nest2(): print('

我是一名python初学者,我很难理解函数式编程的简单概念。我根本不明白为什么会调用嵌套函数(见下面的示例)。这很难解释

func3 = func1(func2)
这里我用位置参数
func2
调用
func1
。一切都很好
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()

在最后一个示例中,您需要调用返回的函数,该函数带有一个额外的
()

输出:

1

在最后一个示例中,您需要调用返回的函数,该函数带有一个额外的
()

输出:

1
func1()
返回方法
nest1
(不执行),因此调用
func3=func1(func2)
返回
nest1
并将其分配给
func3

下一行执行分配给
func3
的任何内容,即方法
nest1
。换句话说,行
func3()
正在执行函数
nest1
,并导致文本打印。

func1()
返回方法
nest1
(不执行),因此调用
func3=func1(func2)
返回
nest1
,并将其分配给
func3

下一行执行分配给
func3
的任何内容,即方法
nest1
。换句话说,行
func3()
正在执行函数
nest1
,并导致文本打印

但是当我运行代码时,函数nest1已经执行了,尽管我只调用了func1(我不明白为什么要执行嵌套函数)。Func 1只应在不打印任何内容的情况下返回函数。有人能给我解释一下吗

执行此操作时:

func3 = func1(func2)
将函数
func2
传递到函数
func1
。在
func1
中,您定义了一个调用传入函数的函数
nest1
。然后返回此函数并成为
func3
的值。
func1
唯一要做的就是创建
nest1
函数并返回它。调用
func3
时,实际上调用了
func1
nest1
中定义的函数

如果使用嵌套函数调用简单函数,则不会执行内部函数

第二个示例未按预期工作的原因是,调用
new_func
不会调用
internal
,它只创建
internal
并返回它。这与上述情况相同。调用
func1
并没有调用
nest1
,它只是创建了
nest1
并返回了它。您必须显式地调用
nest1
func3()
)。同样,您需要显式调用从
new_func
返回的函数:

new_func()()
但是当我运行代码时,函数nest1已经执行了,尽管我只调用了func1(我不明白为什么要执行嵌套函数)。Func 1只应在不打印任何内容的情况下返回函数。有人能给我解释一下吗

执行此操作时:

func3 = func1(func2)
将函数
func2
传递到函数
func1
。在
func1
中,您定义了一个调用传入函数的函数
nest1
。然后返回此函数并成为
func3
的值。
func1
唯一要做的就是创建
nest1
函数并返回它。调用
func3
时,实际上调用了
func1
nest1
中定义的函数

如果使用嵌套函数调用简单函数,则不会执行内部函数

第二个示例未按预期工作的原因是,调用
new_func
不会调用
internal
,它只创建
internal
并返回它。这与上述情况相同。调用
func1
并没有调用
nest1
,它只是创建了
nest1
并返回了它。您必须显式地调用
nest1
func3()
)。同样,您需要显式调用从
new_func
返回的函数:

new_func()()

功能2的主体是:

def nest2():
    print('Nest2')

nest2()

return nest2
print('Nest1')

def nest2():
    print('Nest2')

nest2()

return nest2
所以
func1(func2)
的主体是:

def nest2():
    print('Nest2')

nest2()

return nest2
print('Nest1')

def nest2():
    print('Nest2')

nest2()

return nest2

nest1

func2
主体中,用
func2
主体替换
func
得到的最后一块是:

def nest2():
    print('Nest2')

nest2()

return nest2
print('Nest1')

def nest2():
    print('Nest2')

nest2()

return nest2
所以
func1(func2)
的主体是:

def nest2():
    print('Nest2')

nest2()

return nest2
print('Nest1')

def nest2():
    print('Nest2')

nest2()

return nest2

最后一部分是将
func
替换为
nest1
主体中的
func2
func3
nest1
是同一个对象,您正在调用
func3
。是的。我才意识到。。。我这边的问题真愚蠢。。。不过,谢谢!不过,您正在调用
nest1
func3
nest1
是同一个对象,您正在调用
func3
。是的。我才意识到。。。我这边的问题真愚蠢。。。不过,谢谢!