Python进阶-多重嵌套和闭包

这个概念真的有点难,我思考了两天才开始写这篇教程,这和java 真的有点不太一样,没事,咱一步一步来,一点点分解。

以下内容仅作者理解,并不权威,如果有不恰当的地方,请技术大牛指点。

在python中 函数属于‘一等公民’,可以相互嵌套。

看一个例子:

注意:定义内函数后,要返回内函数的引用 即 return inner

这个例子很浅显易懂,只是函数进行了嵌套

接下来看一个稍微复杂一点的例子

这里就存在一个闭包的概念,我们先看一下:

闭包:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

#在一个外函数(outer)中定义了一个内函数(inner),内函数里运用了外函数的临时变量(x,y=10),并且外函数的返回值是内函数的引用(return inner())。这样就构成了一个闭包。

这里特殊说明一下,按照我们通常的经验,一个函数被调用的时候,会在内存空间分配一部分空间,来存储在和函数内部的变量等,当这个函数调用完成之后,这一部分空间会被释放。但是闭包有一点点不同,当外层函数执行完后,内层函数没有,它的引用依然被持有,所以外层函数的局部变量不能被释放,这个局部变量就被绑定在内层函数上了,然后外层函数再被释放。

巩固一下这个解释

这里有一个错误 return inner 不能加()差别小伙伴们自己想清楚哦


20190531补充

这个东西还是要讲一下,不然讲下一个话题,不太好开展

关于inner() 和inner

inner 其实通俗的理解他就是一个函数的名字,这个名字指向一个函数,当后面没有小括号的时候,它可以被传递,被赋值,但是不会去执行。

inner()加上(),就是告诉程序,通过inner 名字找到这个函数,然后执行这个函数


通俗的讲,如何能形成闭包?

1.存在函数的嵌套2.内层函数要引用外层函数的变量3外层函数要返回内层函数的引用

为什么要使用闭包?

举个例子,这个例子是从别人那里偷来的

定义直线 y = a*x+b  如何使用闭包 创建一个函数可以生成对于任意a,b的直线呢?


这样可以对于任意a,b,如果要取到任意ab 写函数 ,那要写无数个方法了

在上述代码中,内部函数line() 中其实没有临时参数a,b.在python 中如果在自己的作用于里没有找到相应的参数,即像上一级控件中去寻找,在外部函数line_fun 中找到使用

如果我们想处理 过坐标(0,1)这一点的所有直线 显然是y = a*x +1 这样一条直线,如果想像刚才一样来一个方法 大家感受一下

这里看 我们并没有成功的改变b 

之所以没有改变b,就是刚才所说的作用域的问题,内部函数在内部没有找到参数b,去外层函数寻找 寻找后使用外层函数的b = 1;可以打印一下两个b的地址发现两个b 根本不是同一个b

两个b 参数之间的关系

为什么?(这也是为什么叫闭包)

闭包作为对象被返回时,它的引用变量就已经确定(已经保存在它的__closure__属性中),不会再被修改。是的,闭包在被返回时,它的所有变量就已经固定,形成了一个封闭的对象,这个对象包含了其引用的所有外部、内部变量和表达式。闭包的参数例外。

print(line_fun(10).__closure__)

# (< cell at 0x10a07cb58: int object at 0x109e366c0 >, < cell at 0x10a07cb88: int object at 0x109e365a0 >)

# __closure__属性返回的是一个元组对象,包含了闭包引用的外部变量。

闭包的实际应用?

暂时还木有用到 用到后过来添加

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 以下翻译自Apple官方文档,结合自己的理解记录下来。翻译基于 swift 3.0.1 原文地址 Closure...
    艺术农阅读 1,486评论 0 3
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,707评论 2 9
  • 来源于 现代JavaScript教程闭包章节中文翻译计划本文很清晰地解释了闭包是什么,以及闭包如何产生,相信你看完...
    71f241c96a34阅读 567评论 0 1
  • 刚来报到的时候,接待我的师姐带我来找宿舍,当时九月份的广州,下午三四点,晴空万里,温度突破30度。而当我知道我住在...
    KE大叔阅读 495评论 0 1
  • 我接触过很多人,虽然不都是面对面的,但与他们产生交集,对我来说就是一种幸运。 2017.11.19 星期日 阴 最...
    离歧阅读 617评论 5 6