查看原文
其他

Python进阶系列连载(8)——闭包(上)

2018-01-06 王大伟 Python爱好者社区

作者:王大伟

Python爱好者社区唯一小编

博客:https://ask.hellobi.com/blog/wangdawei


前文传送门:

Python进阶系列连载(1)——那些容易被忽略的问题(上)

Python进阶系列连载(2)——那些容易被忽略的问题(中)

Python进阶系列连载(3)——那些容易被忽略的问题(下)

Python进阶系列连载(4)——迭代器

Python进阶系列连载(5)——生成器(上)

Python进阶系列连载(6)——生成器(中)

Python进阶系列连载(7)——生成器(下)


如果还没看过我的入门连载部分,先看:

Python从零开始系列连载(25)——Python的random模块简单使用(入门知(姿)识(势)学习的最后一篇(片))


当然,小编的免费入门课程已经有咯,看过连载的朋友可以看看视频再快速梳理一遍~

视频传送门:点击文末阅读原文


闭包


同学们好,今天我们要讲一个新的知识点——闭包。


小明:老湿,什么是闭包啊?


这个问题问得好,闭包就是...


闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。

这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。

所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。


小明:老湿,可以说人话么?


哈哈,这是我直接读的计算机科学中对闭包的定义。


小明:老湿,那能解释的通俗易懂么?


这个嘛,我想想,


简单来说,闭包就是根据不同的配置信息得到不同的结果~


小明:恕我愚钝,告辞!【小明站起身来】

小明啊,你一开始不理解才是正常的,先坐下,一般人都不会知道的。


橙独秀同学:老湿,我知道闭包是什么!【橙独秀同学站了起来】


橙独秀同学,请你坐下!还没轮到你发言!


好了,我们先举个栗子看看:



大家看,这是什么?


小明:老湿,这不就是定义了一个函数,然后调用函数么?


是的没错,我们继续看:



这个呢?


小明:老湿,根据入门基础班里说的,这应该是在内存中的一个东西,具体的化,func没有带括号,不是函数调用呢


好的,这其实是func指向了一个函数块,而这个函数块是function类型。


小明:不是很懂额


我们看个学过的例子:



小明:这个我知道,就是x和y都引用了同一个内存空间的数据


是的呢,讲了这么多,就是为了搞清楚func具体是个啥,可以简单认为他就是一个对函数的引用


我们接着看:



这段代码怎么解释呢?


小明:这是一个函数func()中定义了另一个函数func_in( )

然后调用func()函数,函数func_in()并没用被调用

但返回的是func_in()函数的引用


小明说的不错,正是这样!


我们给代码加点特效看看:



小明:这个的话,比上一段代码加了一个将func()调用后赋值给a,然后调用a么

可是这个a为啥可以加括号像函数一样调用呢?


小明这个问题问得好,还记得刚讲过的func是函数的引用么,它指向一个函数。

这里a相当于得到了func(2)函数调用后返回的func_in函数的引用,然后自然可以写出a()

相当于func_in( )来调用func_()函数啦~


小明:有道理啊,可是这样做有什么用呢?


小明,这其实就是闭包!


小明:什么?这就是闭包?但是老湿还没回答闭包有啥用呢!


这个不急,我们继续看看,这段代码的特征:

1.func函数里内嵌了一个func_in函数

2.func_in函数使用了外部函数func中的num变量

3.外部函数func最后返回了func_in函数


小明:是啊!


小明啊,闭包的特征就是:

1.闭包函数必须有内嵌函数

2.内嵌函数需要引用该嵌套函数上一级namespace中的变量

3.闭包函数必须返回内嵌函数


这里全都达到要求了,所以这是个闭包!


闭包就是在函数内部再定义一个函数,并且这个函数用到了外面函数的变量,

那么将这个函数以及用到的一些变量称之为闭包。


小明:这样说我就感觉了解闭包是个啥了!


好的,我们说说闭包的作用!


看例子:



小明,如果你要买个电脑,你会选择什么配置?


小明:说起这个我就很伤心啊,我的老师说要结婚了


??我没说要结婚啊


小明:我说的是我的cang老师啊,她都发微博了,你看!



咳咳,小明,那和你买电脑有啥关系!


小明:我怕以后看不到老师的作品了,决定将她的作品都收藏一下,所以买个大点的硬盘


嗯,又道理,我们可以这样:




小明:老湿,你真懂我!


橙独秀同学,你来说说你要啥电脑配置?


橙独秀同学:终于轮到我发言了,我对内存没太大要求,我也想要2T硬盘

不过我显卡要1080Ti的,我要做deep learning


橙独秀同学很要上进心啊,那我们怎么写代码完成他的要求呢?


小明:老湿,你代码里str1参数改了应该就行吧


小明说的不错,我们可以这样:



小红:老湿,我也想要!我要粉红色的,配置和小明一样!


好的:



好了,大家的电脑基本配置都搞定了,我们回头看看闭包的定义!

刚上课时候我说了:

简单来说,闭包就是根据不同的配置信息得到不同的结果~

至于闭包的优点,我们下节课再说!


现在大家懂了么?


小明:懂了!


小明都懂了,我相信大家应该都懂了!


今天作业:

在今天说的代码基础上给自己配置一个电脑

自己不敲代码永远学不会写代码

下课

人生苦短,我选Python

未完待续,连载中......

欢迎评论指出文中错误和提问~~~


小编的免费Python入门课程已经登场,等你来撩~

已经3000+小伙伴加入学习啦~

点击阅读原文,立即学习

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”,开始学习Python课程:

关注后在公众号内回复“课程”即可获取:

小编的Python入门视频课程!!!

崔老师爬虫实战案例免费学习视频。

丘老师数据科学入门指导免费学习视频。

陈老师数据分析报告制作免费学习视频。

玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。

丘老师Python网络爬虫实战免费学习视频。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存