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

浏览: 3268

前言

进阶部分连载继续~

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

https://ask.hellobi.com/blog/wangdawei/10288


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

视频传送门:https://edu.hellobi.com/course/234

图片.png


前文传送门:

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

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

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

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

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

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

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


闭包


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


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


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


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

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

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

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


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


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


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


这个嘛,我想想,


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


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

图片.png

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


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


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


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


图片.png


大家看,这是什么?


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


是的没错,我们继续看:


图片.png


这个呢?


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


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


小明:不是很懂额


我们看个学过的例子:


图片.png


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


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


我们接着看:


图片.png


这段代码怎么解释呢?


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

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

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


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


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


图片.png


小明:这个的话,比上一段代码加了一个将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.闭包函数必须返回内嵌函数


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


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

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


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


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


看例子:


图片.png


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


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


??我没说要结婚啊


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


图片.png


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


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


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


图片.png


小明:老湿,你真懂我!


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


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

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


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


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


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


图片.png


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


好的:

图片.png


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

刚上课时候我说了:

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

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


现在大家懂了么?


小明:懂了!


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


今天作业:

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

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

下课

人生苦短,我选Python

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

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


下一篇链接:Python进阶系列连载(9)——Python内置高阶函数map(上)

推荐 10
本文由 ID王大伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

5 个评论

老师,请教个问题:
# coding: utf-8
import sympy
x = symbol('兔子的数量')
y = symbol('鸡的数量')
solve([x+y-30,4*x+2*y-86],[x,y])

--------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-20-ea71d36aadf8> in <module>()
1 # coding: utf-8
2 import sympy
----> 3 x = symbol('兔子的数量')
4 y = symbol('鸡的数量')
5 solve([x+y-30,4*x+2*y-86],[x,y])

NameError: name 'symbol' is not defined
# coding: utf-8
from sympy import Symbol,solve
x = Symbol('兔子的数量')
y = Symbol('鸡的数量')
solve([x+y-30,4*x+2*y-86],[x,y])
老湿,闭包的另一半在哪里~~~
之后会更新的 上次写的忘记了 哈哈
老师,闭包的坑填了吗?

要回复文章请先登录注册