Python基础之闭包
一.闭包的定义:
在一个函数的内部,再定义一个函数(内部函数)。这个内部函数引用了外部函数的变量,并且外部函数返回这个内部函数,我们把这个使用外部函数变量的内部函数称为 闭包 。
简而言之,闭包就是能够读取外部函数内的变量的函数。
例如:def f1(): # f1外部函数 n = 999 # n:外部函数的变量 def f2(): # 内部函数 print(n) # f2中引用f1的变量 return f2 # 外部函数f1返回内部函数f2,函数f2即是闭包 #调用法一 f1()() # 调用法二 # result=f1() # result()
形成闭包的两个条件:函数的返回值必须是被包函数对象(函数名) 闭包中必须引用了外层函数作用域内的变量或者形参
二.闭包的用途
① 可以读取函数内部的变量
② 将一些变量的值始终保存到内存中
1.读取函数内部的变量
在一般情况下,在函数外部我们是不能访问到函数内部的变量的。但是,有时想要在函数外部能够访问到函数内部的变量,那么就可以使用闭包。
例如:def f1(): a=100 print(a) #NameError: name "a" is not defined
上面的代码可以看出,print(a)会抛异常NameError: name "a" is not defined。在函数f1的外面无法访问它的变量的。
在函数f1里面定义一个闭包函数就可以访问到了
例如:def f1(): a = 100 def f2(): return a return f2 result = f1() a = result() print(a)
2.将一些变量的值始终保存到内存中def f1(n1): # 外部函数 def f2(n2): # 内部函数 result = n1 + n2 # 内部函数引用了外部函数的变量n1 print("计算结果:", result) return f2 f=f1(1) #创建闭包实例 #执行闭包 f(2) f(3)
运行结果:计算结果: 3 计算结果: 4
通过上面的输出结果可以看出闭包保存了外部函数内的变量n1的值1,每次执行闭包都是在n1 = 1 基础上进行计算的。
三.闭包的缺点
1.由于闭包会使得函数中的变量都被保存在内存中,会增加 内存消耗 ,所以不能滥用闭包,否则会造成程序的性能问题,可能导致内存泄露
2.闭包无法改变外部函数局部变量指向的内存地址
3.返回闭包时,返回函数不要引用任何循环变量,或者后续会发生变化的变量
四.判断一个函数是否是闭包
判断一个函数是不是闭包,可以查看它的 closure 属性。如果该函数是闭包,查看该属性将会返回一个cell对象组成的tuple。如果我们分别对每个cell对象查看其cell_contents属性,返回的内容就是闭包引用的自由变量的值。 def outer(args): a = 10 b = 15 c = 25 def inner(): return a + b+args return inner out = outer(4) # 闭包实例 print(out.__closure__)
运行结果:( , , )
闭包的__closure__方法,可以展示出闭包储存了外部函数的两个变量,cell的内存地址是什么,在cell里面储存的对象类型是int,这个int储存的内存地址是什么。
闭包的__closure__方法,可以查看每个cell对象的内容 def outer(args): a = 10 b = 15 c = 25 def inner(): return a +b+ args return inner out = outer(4) # 闭包实例 # print(out.__closure__) for i in out.__closure__: print(i.cell_contents)
运行结果:10 4 15
cell_contents解释了局部变量在脱离函数后仍然可以在函数之外被访问的原因,因为变量被存储在cell_contents中了。 | | |
本轮房地产调控的一点认识过去几轮房地产调控主要是由房价上涨过快引发的调控,调控的手段多采用限购提高首付比例和按揭利率等措施,主要调控对象是购买端。调控政策放松主要是由于经济处于下行周期而逐步放开。本轮调控
恒大地产更换董事长,恒大汽车遭高管减持昨日许家印辞去恒大地产集团董事长的消息引起了不小的波动。根据公告信息,许家印不再担任恒大集团旗下的恒大地产集团董事长,柯鹏不再担任总经理法人等职务,信任董事长总经理法人为赵长龙。恒
科比布莱恩特,惊涛骇浪短暂的一生!17岁进入NBA,因年龄太小,科比的所有程序和合同,财政,都是父母负责。1996科比加盟湖人,新秀合同3年350万,签约阿迪达斯,6年4800万,1999年科比续约湖人6年7800
清明时节雨纷纷,一键除湿不求人CiaoBello,我是老房。冬天刚刚过去,转眼间清明已经临近。清明时节雨纷纷,每天下雨烦死人。魔都的潮湿天气从清明节左右就已经开始了。想到再过两三个月就是梅雨季,每天淅淅沥沥的雨
宅家办公,如何打造整洁桌面?CiaoBello,我是老房。突如其来的疫情,给足了咱们宅在家里的时间,终于能静下心来好好收拾一下杂乱了许久的桌面。首先来看下老房家里书桌的大致情况。书桌为宜家BEKANT贝肯特右
聊聊Jmeter如何并发执行Python脚本来源AirPython作者星安果1。前言大家好,我是安果!最近有小伙伴后台给我留言,说自己用Django写了一个大文件上传的Api接口,现在想本地检验一下接口并发的稳定性,问我有没
聊聊Jmeter如何并发执行Python脚本来源AirPython作者星安果1。前言大家好,我是安果!最近有小伙伴后台给我留言,说自己用Django写了一个大文件上传的Api接口,现在想本地检验一下接口并发的稳定性,问我有没
用Python帮小伙伴找到头上一片绿的证据公众号Python技术作者派森酱这周末有个小伙伴找到派森酱,说他女票这几天整天都在上网,也不知道浏览什么内容,只要这个小伙伴凑上去瞧瞧就只看见了桌面,查看浏览器历史记录也被删除的一
用Python带你看豆瓣上征婚交友的小姐姐们作者某某白米饭来源Python技术派森酱在刷豆瓣的时候发现,豆瓣上居然还有一个叫我被豆油表白了的交友话题,阅读量居然高达8087734次,拥有1000篇话题,几乎每篇平均被阅读了8
败了,苹果彻底败了文章首发于微信公众号非著名程序员,欢迎大家关注。大家好,我是校长。苹果又败诉了,可谓是开发者的福音。01hrEpicGames案备受瞩目的EpicGames诉苹果一案今天达成判决,
苹果这是打造了一个产学研销为一体的生态平台啊文章首发于微信公众号非著名程序员,欢迎大家关注。大家好,我是校长。今天聊一聊昨天苹果的一个大事件吧。昨天,苹果宣布为小学生与教育工作者推出全新资源,包括新的人人能编程早期学习者活动