信息技术:96什么是闭包,Python闭包(初学者必读).docxVIP

信息技术:96什么是闭包,Python闭包(初学者必读).docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
什么是闭包,Python闭包(初学者必读) 前面章节中,已经对Python闭包做了初步的讲解,本节将详解介绍到底什么是闭包,以及 使用闭包有哪些好处。 闭包,又称闭包函数或者闭合函数,其实和前面讲的嵌套函数类似,不同之处在于,闭包中 外部函数返回的不是一个具体的值,而是一个函数。一般情况下,返回的函数会赋值给一个 变量,这个变量可以在后面被继续执行调用。 例如,计算一个数的n次幕,用闭包可以写成下面的代码: #闭包函数,其中exponent称为自由变量def nth_power(exponent): def exponent_of(base): return base ** exponentreturn exponent_of # 返回值是 exponent_of 函数 square = nth_power(2) # 计算一个数的平方cube = nth_power(3) #计算一个数的立方 print(square(2)) # 计算 2 的平方 print(cube(2)) # 计算 2 的立方 运行结果为: 在上面程序中,外部函数nth_power()的返回值是函数exponent_of(),而不是一个具体 的数值。 需要注意的是,在执行完square=nth_power(2)和cube=nth_power(3)后,外部函 数nth_power()的参数exponent会和内部函数exponent.of 一起赋值给squre和 cube ,这样在之后调用square⑵ 或者cube⑵ 时,程序就能顺利地输出结果,而不会 报错说参数exponent没有定义。 看到这里,读者可能会问,为什么要闭包呢?上面的程序,完全可以写成下面的形式: def nth_power_rewrite(base, exponent): return base ** exponent 上面程序确实可以实现相同的功能,不过使用闭包,可以让程序变得更简洁易读。设想一下, 比方需要计算很多个数的平方,那么读者觉得写成下面哪一种形式更好呢? #不使用闭包 TOC \o 1-5 \h \z resl = nth_power_rewrite(basel,2) res2 = nth_power__rewrite(base2,2)res3 = nth_power_rewrite(base3,2) #使用闭包square = nth_power(2) resl = square(basel)res2 = square(base2) res3 = square(base3) 显然第二种方式表达更为简洁,在每次调用函数时,都可以少输入一个参数。 其次,和缩减嵌套函数的优点类似,函数开头需要做一些额外工作,当需要屡次调用该函数 时,如果将那些额外工作的代码放在外部函数,就可以减少屡次调用导致的不必要开销,提 高程序的运行效率。 Python闭包的_closure_属性 闭包比普通的函数多了一个_closure_属性,该属性记录着自由变量的地址。当闭包被 调用时,系统就会根据该地址找到对应的自由变量,完成整体的函数调用。 以nth_power()为例,当其被调用时,可以通过_closure_属性获取自由变量(也就是 程序中的exponent参数)存储的地址,例如: def nth_power(exponent): def exponent_of(base): return base ** exponentreturn exponent_of square = nth_power(2)#查看_closure_的值 print(square._closure_) 输出结果为: (cell at 0x0000014454DFA948: int object at 0x00000000513CC6D0z) 可以看到,显示的内容是一个int整数类型,这就是square中自由变量exponent的初 始值。还可以看到,_closure_属性的类型是一个元组,这说明闭包可以支持多个自由变 量的形式。

文档评论(0)

艺心论文信息咨询 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体成都艺心风尚电子商务有限公司
IP属地四川
统一社会信用代码/组织机构代码
91510100MA6CA54M2R

1亿VIP精品文档

相关文档