闭包

发布时间 2023-08-26 16:28:50作者: Allen_Hao

函数参数

Python中一切皆引用:变量名(包括类名和函数名等)存放的都是内存空间(地址),所以都可以作为参数传递

 

函数名的作用

① 函数名存放的是函数所在空间的地址

② 函数名()执行函数名所存放空间地址中的代码

③ func01 = func02函数名可以像普通变量一样赋值,func01() 等价于 func02()

 

示例

'''
Python中一切皆引用:变量名(包括类名和函数名等)存放的都是内存空间(地址),所以都可以作为参数传递
'''


def func01():
    print("func01 is show")


# 1. 通过“函数()”形式执行函数
# func01()

# 2. 函数名存放的是函数所在空间的地址
print(func01)  # <function func01 at 0x0000022594FBD8A0>


# 3. 函数名也可以像普通变量一样赋值即函数名、类名都是引用类型
# func02 = func01
# func02()

# 4. 函数当实参传递
def foo(func):
    func()  # 执行函数


foo(func01)

1. 函数名存放的是函数所在空间地址
2. 函数名()执行函数名所存放空间地址中的代码

闭包

有了函数可以当作实参传递,就有了衍生出了闭包的概念

定义

在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包

1. 闭包是一个函数的引用即可以理解为是一个函数名

2. 闭包的3个前提条件

  1> 函数嵌套

  2> 内部函数使用了外部函数的变量(包含外部函数的形参变量)

  3> 外部函数的返回值是内部函数的引用

示例

1 def outer_function(x):
2     def inner_function(y):
3         return x + y
4     return inner_function
5 
6 closure = outer_function(5)  # closure就是闭包
7 print(closure(3))  # 输出8

 

在这个示例中,outer_function是外部函数,它接受一个参数x

在外部函数中,我们定义了一个内部函数inner_function,它接受一个参数y

内部函数引用了外部函数的变量x,并返回x + y的结果。

 

然后,我们调用outer_function并将其结果赋值给变量closure。此时,closure就成为了一个闭包,它可以访问和操作外部函数作用域中的变量x

最后,我们调用closure并传入参数3,输出结果为8。这是因为closure内部的inner_function可以访问并操作外部函数作用域中的变量x,所以它返回了5 + 3 = 8