什么是闭包,Python闭包(初学者必读)
admin
2024-04-27 01:44:06
0

文章目录

  • Python 闭包
    • Python闭包的__closure__属性


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 的立方

运行结果为:

4
8

在上面程序中,外部函数 nth_power() 的返回值是函数 exponent_of(),而不是一个具体的数值。

需要注意的是,在执行完 square = nth_power(2) 和 cube = nth_power(3) 后,外部函数 nth_power() 的参数 exponent 会和内部函数 exponent_of 一起赋值给 squre 和 cube,这样在之后调用 square(2) 或者 cube(2) 时,程序就能顺利地输出结果,而不会报错说参数 exponent 没有定义。

看到这里,读者可能会问,为什么要闭包呢?上面的程序,完全可以写成下面的形式:

def nth_power_rewrite(base, exponent):return base ** exponent

上面程序确实可以实现相同的功能,不过使用闭包,可以让程序变得更简洁易读。设想一下,比如需要计算很多个数的平方,那么读者觉得写成下面哪一种形式更好呢?

# 不使用闭包
res1 = nth_power_rewrite(base1, 2)
res2 = nth_power_rewrite(base2, 2)
res3 = nth_power_rewrite(base3, 2)
# 使用闭包
square = nth_power(2)
res1 = square(base1)
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__)

输出结果为:

(,)

可以看到,显示的内容是一个 int 整数类型,这就是 square 中自由变量 exponent 的初始值。还可以看到,__closure__ 属性的类型是一个元组,这表明闭包可以支持多个自由变量的形式。

相关内容

热门资讯

电信网和互联网勒索软件防范指南 文件类型:PDF 文件页数:10+ 下载方式:见文末 ———————— 本文件提出了电信网和互联网...
金价、银价、油价,都跌了 当地时间本周二,随着市场对通胀压力的担忧加剧,美国国债收益率持续走高,引发全球债券市场抛售潮。 ...
李寒琼卸任雅戈尔服装制造公司董... 雅戈尔服装制造有限公司发生工商变更,李寒穷卸任法定代表人、董事长,但仍担任副董事长职务,胡纲高接任法...
雷军:小米YU7 GT为时代精... 5月20日,小米创办人,董事长兼CEO雷军发视频回应关于小米YU7 GT相关问题。 雷军表示,小米...
军用吉普上鲜花配着机枪:伊朗为... 当地时间5月18日,伊朗在首都德黑兰为500对报名参加了“奉献生命”计划的夫妇举行了集体婚礼。 婚...
原创 太... 最近,一条消息刷爆了整个财经圈,让无数国人直呼 "太解气"!中国海越能源集团直接硬刚花旗银行和摩根大...
原创 人... 大家好,我是中医主任郭洪波。 血压高不高,早上起床那半小时就能看出来, 早晨是人一天中血压最高的时候...
原创 五... 作者|睿研消费 编辑|Emma 来源|蓝筹企业评论 白酒界的巨头五粮液交出一份“历史最差”成绩单,吓...
美债收益率飙升与美元强势压制金... 来源:市场资讯 文章来源:汇通财经 现货黄金周三亚洲交易时段继续承压下行,金价一度跌至4470美元附...
谈判破裂!三星电子明起大罢工,... 据CCTV国际时讯,韩国三星电子今天(5月20日)的劳资谈判再度宣告破裂,明天起将举行大罢工。 韩国...
Meta启动8000人全球裁员... 来源:环球网 【环球网科技综合报道】5月20日消息,据businesstimes援引彭博社报道称,...
年产值超210亿元!南都专访新... 出门拉业务回厂打螺丝,他用20余年时间,把一个仅有2个人的小作坊发展成为数百人的骨干企业,研发出的一...
SEC计划放宽IPO与财务报告... 5月20日,据路透社报道,美国证券交易委员会(SEC)计划大幅放宽公司上市和报告义务的规则,以推动特...
企业服务领域投融资日报(5月1... 据亿欧数据统计,昨日(2026年5月19日)共披露21起投融资事件,涉及16家国内企业,5家国外企业...
日本国债遭抛售 来源:滚动播报 (来源:北京商报) 日本国内债券市场18日延续抛售行情。作为长期利率指标的新发10年...
长江存储正式启动IPO辅导,上... 长江存储控股股份有限公司启动IPO辅导,中信建投和中信证券为辅导券商 投资时间网、标点财经快讯 ...
【行业】国家能源局发布| 20... 来源:储能科学与技术 近日,国家能源局发布全国各地2026年一季度光伏发电建设情况,全国2026年一...
首程控股:持续加码投资人形机器... 中证智能财讯 首程控股(00697)5月20日早间公告,公司之全资附属公司所管理的基金近日投资北京加...
5月20日投资避雷针:9天6板... 导读:财联社5月20日投资避雷针,近日A股及海外市场潜在风险事件如下。国内经济信息方面包括:1)沿海...