| 关键词: 闭包 函数 nbsp 一个 变量 func python 就是 自由 包裹 | ||||
前几天又有人在我的这篇文章 python项目练习一:即时标记 下留言,关于其中一个闭包和re.sub的使用不太清楚。我在自己的博客上搜索了下,发现没有写过闭包相关的东西,所以决定总结一下,完善博客上Python的内容。 1. 闭包的概念 首先还得从基本概念说起,什么是闭包呢?来看下维基上的解释:
上面提到了两个关键的地方: 自由变量 和 函数, 这两个关键稍后再说。还是得在赘述下“闭包”的意思,望文知意,可以形象的把它理解为一个封闭的包裹,这个包裹就是一个函数,当然还有函数内部对应的逻辑,包裹里面的东西就是自由变量,自由变量可以在随着包裹到处游荡。当然还得有个前提,这个包裹是被创建出来的。 在通过Python的语言介绍一下,一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。你在调用函数A的时候传递的参数就是自由变量。 举个例子:
这里面调用func的时候就产生了一个闭包——inner_func,并且该闭包持有自由变量——name,因此这也意味着,当函数func的生命周期结束之后,name这个变量依然存在,因为它被闭包引用了,所以不会被回收。 另外再说一点,闭包并不是Python中特有的概念,所有把函数做为一等公民的语言均有闭包的概念。不过像Java这样以class为一等公民的语言中也可以使用闭包,只是它得用类或接口来实现。 更多概念上的东西可以参考最后的参考链接。 2. 为什么使用闭包 基于上面的介绍,不知道读者有没有感觉这个东西和类有点相似,相似点在于他们都提供了对数据的封装。不同的是闭包本身就是个方法。和类一样,我们在编程时经常会把通用的东西抽象成类,(当然,还有对现实世界——业务的建模),以复用通用的功能。闭包也是一样,当我们需要函数粒度的抽象时,闭包就是一个很好的选择。 在这点上闭包可以被理解为一个只读的对象,你可以给他传递一个属性,但它只能提供给你一个执行的接口。因此在程序中我们经常需要这样的一个函数对象——闭包,来帮我们完成一个通用的功能,比如后面会提到的——装饰器。 3. 使用闭包 第一种场景 ,在python中很重要也很常见的一个使用场景就是装饰器,Python为装饰器提供了一个很友好的“语法糖”——@,让我们可以很方便的使用装饰器,装饰的原理不做过多阐述,简言之你在一个函数func上加上@decorator_func, 就相当于decorator_func(func): 最新评论
72小时资讯榜
2
19岁黑客跨三国换IP狂奔,还是被Windows一
网安动态
339人已阅读
3
18K Star,让AI自己跑渗透测试,这个开源项
渗透测试
324人已阅读
4
一个 1.5B 的模型,把网络安全攻防都装进了
安全学院
358人已阅读
5
多家电商遭“银狐”木马攻击,央视披露细节
网安动态
558人已阅读
6
手机也能AI养龙虾:安卓和iOS版OpenClaw应
AI动态
536人已阅读
社区热门
1
━※☆※━★===二〇二六年论坛每日签到帖=
2026-03-13
4
从上大学一直玩黑基 到现在已经37岁 感谢黑
2025-06-03
6
好久没来这里了,居然能正常登录,佩服站长
2025-05-19
|