- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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_属性的类型是一个元组,这说明闭包可以支持多个自由变 量的形式。
您可能关注的文档
- 农商银行零星维修工程安全文明施工措施.docx
- 农商银行零星维修工程专业化水平、诚信建设、品牌建设、服务能力.docx
- 农业生产社会化服务项目实施方案.docx
- 农业专题练习.docx
- 写给医院医生及护士长的感谢信十篇.docx
- 写给医院医生及护士长的感谢信五篇范例.docx
- 写给医院医生及护士长的感谢信五篇例文.docx
- 写给医院全体医护人员感谢信十篇范文.docx
- 写给医院全体医护人员感谢信十篇模板.docx
- 写给医生的感谢信十篇范例.docx
- 信息技术:78Python while循环语句详解.docx
- 信息技术:71Python encode和decode方法:字符串编码转换.docx
- 信息技术:6Python能干什么,Python的应用领域.docx
- 信息技术:62Python join方法:合并字符串.docx
- 信息技术:4Python的特点(优点和缺点).docx
- 信息技术:47Python list列表删除元素(4种方法).docx
- 信息技术:42Python三目运算符(三元运算符)用法详解.docx
- 信息技术:37Python算术运算符及用法详解.docx
- 信息技术:25Python变量的定义和使用.docx
- 信息技术:2020学年第二学期八年级下信息技术期末测评试题卷.docx
文档评论(0)