谈闭包前,先看两个函数的引用的案例
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
如下,所谓的闭包,就是在一个函数里面func里面再定义一个内部函数result。这个内部函数result可以引用(实际可以不引用)外部函数func
的参数和局部变量。此外将内部函数的函数体当做外部函数的返回值(相关参数和变量都保存在返回的函数中)返回给函数。这种内部函数的形式就被称为“闭包(Closure)”说到底,闭包就是高级函数的使用。
def func(a):print("this is :",a)def result(x,y):sum = a*x +yprint("sum is :",sum)return sumreturn 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("准备使用闭包了,我要校验一下,做个权限检查")passnum = 1000def result1(x,y): #这里就没有引用外部函数的变量sum = x +yprint("sum is :",sum)return sumreturn result1 #注意这里返回值是函数名,不是result().这个返回值是func的返回值,闭包的核心f1 = func1()
f1(10,20)'''
准备使用闭包了,我要校验一下,做个权限检查
sum is : 30
'''
内部函数修改外部函数中的变量
def counter(start=0):def incr():nonlocal start # nonlocal python3才有 表示将变量声明为外层变量(外层函数的局部变量,而且不能是全局变量,区别global)start += 1return startreturn incrc1 = 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'''
1.闭包的特性:
1.闭包似优化了变量,原来需要类对象完成的工作,可以闭包可以完成,其实提高了代码的封装性
2.闭包提高了代码的复用性,只要体现在装饰器的使用。
3.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
2.闭包的用处:
闭包真正发挥用处的是在装饰器中的使用,装饰器强大的功能就是基于闭包实现的。
统一声明:关于原创博客内容,可能会有部分内容参考自互联网,如有原创链接会声明引用;如找不到原创链接,在此声明如有侵权请联系删除哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联系删除哈。
本文发布于:2024-01-30 03:22:27,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170655615118874.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |