一文读懂python中的闭包

一文读懂python中的闭包

【干货满满】

昨日突然有小伙伴来问我python中的闭包到底是个神马东东,一想到我当初学习闭包时也是稀里糊涂的,所以特意写了一篇文章来讲解python中的闭包到底应该怎么用,希望能给大家带来帮助。

一、闭包的基本理解
在介绍闭包之前,先简单理解下两种函数概念。

外函数:嵌套函数中*外层的函数称之为外函数。

内函数:嵌套函数中*内层的函数称之为内函数。

闭包的特点:

①:闭包是一种特殊的函数,由外函数和内函数嵌套而成;

②:内函数引用了外函数的临时变量;

③:将使用临时变量的内函数作为外函数的返回值。

二、闭包写法介绍
闭包的基本格式如下:

def 外函数(参数a):
外函数临时变量b = 某值
def 内函数(参数c):
print(运算操作)
return 内函数

res = 外函数(参数a)
res(参数c)

其中:

①:外函数中可传入多个参数,也可不传入参数;

②:外函数中可定义一个或多个临时变量,用于内函数对其引用;

③:内函数可传入多个参数,也可不传入参数;

④:内函数中可对外函数中的参数、临时变量以及内函数中的参数进行相关运算操作;

⑤:然后用一个变量(这里命名为res)接收外函数的返回结果;

⑥:由于外函数的返回的结果为内函数,若直接输出res则会显示对应的内函数内存地址,因此需要写成res(参数c)的形式,才会显示内函数中运算操作的结果。

直接上案例:

def outer(a):
b = 12
def inner(c):
print(a + b + c)
return inner

res = outer(10)
res(5)

此时,*终输出的结果为27。

具体流程为外函数接收了参数a = 10,内函数接收了参数c = 5,同时外函数中的临时变量b被内函数引用,在内函数中打印出(a + b + c)的结果,并将内函数作为外函数的返回结果进行返回,*后直接调用外函数,将返回结果赋为res,再调用内函数,返回*终结果27。

三、 闭包中内函数修改外函数临时变量
下面介绍一种常用的修改外函数临时变量的方法:

利用nonlocal关键字声明临时变量

def outer(a):
b = 12
def inner(c):
nonlocal b
b = 22
print(a+b+c)
return inner
res = outer(10)
res(5)

由于我们在内函数中使用nonlocal关键字声明了临时变量b,并对其重新赋值,所以,此时的计算结果为37。

四、闭包注意事项
一般情况下,函数在运行结束后会将临时变量都释放给内存。但是闭包比较特殊,由于内函数中会用到外函数的临时变量,因此它会将外函数的临时变量与内函数捆绑在一起,在外函数运行结束后,使其临时变量会在后续中继续被内函数调用。

闭包主要用在装饰器中,接下来我将再出一篇python装饰器讲解文章,包含常用装饰器的使用方法和应用案例,欢迎大家评论关注哦。

特此说明
以上介绍仅是个人对于python闭包的理解,衷心希望能对各位小伙伴有所帮助,如有不妥之处欢迎大家批评指正!

一文读懂python中的闭包

一文读懂python中的闭包

【干货满满】

昨日突然有小伙伴来问我python中的闭包到底是个神马东东,一想到我当初学习闭包时也是稀里糊涂的,所以特意写了一篇文章来讲解python中的闭包到底应该怎么用,希望能给大家带来帮助。

一、闭包的基本理解
在介绍闭包之前,先简单理解下两种函数概念。

外函数:嵌套函数中*外层的函数称之为外函数。

内函数:嵌套函数中*内层的函数称之为内函数。

闭包的特点:

①:闭包是一种特殊的函数,由外函数和内函数嵌套而成;

②:内函数引用了外函数的临时变量;

③:将使用临时变量的内函数作为外函数的返回值。

二、闭包写法介绍
闭包的基本格式如下:

def 外函数(参数a):
外函数临时变量b = 某值
def 内函数(参数c):
print(运算操作)
return 内函数

res = 外函数(参数a)
res(参数c)

其中:

①:外函数中可传入多个参数,也可不传入参数;

②:外函数中可定义一个或多个临时变量,用于内函数对其引用;

③:内函数可传入多个参数,也可不传入参数;

④:内函数中可对外函数中的参数、临时变量以及内函数中的参数进行相关运算操作;

⑤:然后用一个变量(这里命名为res)接收外函数的返回结果;

⑥:由于外函数的返回的结果为内函数,若直接输出res则会显示对应的内函数内存地址,因此需要写成res(参数c)的形式,才会显示内函数中运算操作的结果。

直接上案例:

def outer(a):
b = 12
def inner(c):
print(a + b + c)
return inner

res = outer(10)
res(5)

此时,*终输出的结果为27。

具体流程为外函数接收了参数a = 10,内函数接收了参数c = 5,同时外函数中的临时变量b被内函数引用,在内函数中打印出(a + b + c)的结果,并将内函数作为外函数的返回结果进行返回,*后直接调用外函数,将返回结果赋为res,再调用内函数,返回*终结果27。

三、 闭包中内函数修改外函数临时变量
下面介绍一种常用的修改外函数临时变量的方法:

利用nonlocal关键字声明临时变量

def outer(a):
b = 12
def inner(c):
nonlocal b
b = 22
print(a+b+c)
return inner
res = outer(10)
res(5)

由于我们在内函数中使用nonlocal关键字声明了临时变量b,并对其重新赋值,所以,此时的计算结果为37。

四、闭包注意事项
一般情况下,函数在运行结束后会将临时变量都释放给内存。但是闭包比较特殊,由于内函数中会用到外函数的临时变量,因此它会将外函数的临时变量与内函数捆绑在一起,在外函数运行结束后,使其临时变量会在后续中继续被内函数调用。

闭包主要用在装饰器中,接下来我将再出一篇python装饰器讲解文章,包含常用装饰器的使用方法和应用案例,欢迎大家评论关注哦。

特此说明
以上介绍仅是个人对于python闭包的理解,衷心希望能对各位小伙伴有所帮助,如有不妥之处欢迎大家批评指正!