谈闭包前,先看两个函数的引用的案例
def fuc(args):
print("打印一下:",args)
return args +1
#调用函数方式1
fuc(10)
print("*"*20)
f = fuc(10) #将函数的调用结果赋给另外一个变量
print(id(f),id(fuc(10)))
f #这样也相当于调用fuc(10)
print(f,fuc(10)) #11,11
#调用函数方式2
f1 = fuc #这样没有()的方式,将函数体赋给另外一个变量
print(id(f1),id(fuc),f1,fuc)
#9350288 9350288 <function fuc at 0x008EAC90> <function fuc at 0x008EAC90>
fuc(11) #打印一下: 11
f1(11) #打印一下: 11
1.什么是闭包
如下,所谓的闭包,就是在一个函数里面func里面再定义一个内部函数result。这个内部函数result可以引用(实际可以不引用)外部函数func
的参数和局部变量。此外将内部函数的函数体当做外部函数的返回值(相关参数和变量都保存在返回的函数中)返回给函数。这种内部函数的形式就被称为“闭包(Closure)”说到底,闭包就是高级函数的使用。
def func(a):
print("this is :",a)
def result(x,y):
sum = a*x +y
print("sum is :",sum)
return sum
return result #注意这里返回值是函数名,不是result().把result函数作为返回值给func,闭包的核心
-------------------------函数调用---------------------------------------
1.调用外部函数
func(10) #这里只执行了func里面的第一个print.
print("------------")
f1 = func(10)
f1(10,20) #上面的效果等同于func(10)(10,20),对内部函数result进行调用。类似于多重列表的调用
print(f1(10,20)) #打印函数的返回值。
'''
this is : 10
------------
this is : 10
sum is : 120
sum is : 120
120
'''
内部函数(闭包)不一定需要引用外部函数的变量,只是他有这个权限。有时候外部函数用来做一些权限检查之类的。
def func1():
print("准备使用闭包了,我要校验一下,做个权限检查")
pass
num = 1000
def result1(x,y): #这里就没有引用外部函数的变量
sum = x +y
print("sum is :",sum)
return sum
return result1 #注意这里返回值是函数名,不是result().这个返回值是func的返回值,闭包的核心
f1 = func1()
f1(10,20)
'''
准备使用闭包了,我要校验一下,做个权限检查
sum is : 30
'''
内部函数修改外部函数中的变量
def counter(start=0):
def incr():
nonlocal start
# nonlocal python3才有 表示将变量声明为外层变量(外层函数的局部变量,而且不能是全局变量,区别global)
start += 1
return start
return incr
c1 = counter(5)
print(c1())
print(c1())
c2 = counter(50)
print(c2())
print(c2())
print(c1())
print(c1())
print(c2())
print(c2())
'''
6
7
51
52
8
9
53
54
'''
2.闭包的用处和好处
1.闭包的特性:
1.闭包似优化了变量,原来需要类对象完成的工作,可以闭包可以完成,其实提高了代码的封装性
2.闭包提高了代码的复用性,只要体现在装饰器的使用。
3.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
2.闭包的用处:
闭包真正发挥用处的是在装饰器中的使用,装饰器强大的功能就是基于闭包实现的。
统一声明:关于原创博客内容,可能会有部分内容参考自互联网,如有原创链接会声明引用;如找不到原创链接,在此声明如有侵权请联系删除哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联系删除哈。