什么是闭包,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__ 属性的类型是一个元组,这表明闭包可以支持多个自由变量的形式。

相关内容

热门资讯

西安银行[600928]日常公... 本版导读 2026-07-11 2026-07-11 2026-07-11 2026...
菏泽正规的优化网站制作哪家好 引言 在当今数字化时代,拥有一个高质量的网站对于企业和个人都至关重要。菏泽作为一个快速发展的城市,网...
专访万华生态集团总裁、万华生态... 2026年7月8日,第28届中国(广州)国际建筑装饰博览会正式启幕。万华生态集团携万华禾香集团、万华...
原创 胆... 2026年7月8日到9日,美军连续两天对伊朗全境发动空袭,目标直指民用基础设施。伊朗外交部急发声明谴...
宣医新闻|宣武医院首届管理岗位... --宣医新闻-- 宣武医院首届管理岗位 青年职工职业能力竞赛 圆满落幕 7月7日下午,院工会联合党...
推荐专业小红书获客团队,评估风... 在当今数字化营销的浪潮中,小红书已成为品牌和企业实现获客的重要平台。然而,要在小红书上取得良好的获客...
265亿美元!SK海力士纳斯达... 7月9日韩国时间,SK海力士宣布将美国存托股份(ADS)发行价定在149美元/ADS,总计发行1.7...
中信金融资产等在深圳成立私募股... 天眼查App显示,近日,深圳信创焕星特殊机遇私募股权投资基金合伙企业(有限合伙)成立,执行事务合伙人...
大摩邢自强最新观点:下一个催化... 来源:市场资讯 来源:六里投资报 7月9日,国家统计局发布最新数据显示,6月份,居民消费价格指数(C...
机器人大脑竞赛升温,蚂蚁灵波押... 蚂蚁灵波想证明的一件事:机器人大脑正在从通用模型迁移,走向具身原生预训练的新阶段,从模型架构、数据体...
SK集团董事长:若股价稳定,考... SK海力士本周完成了外资企业在美最大规模首次公开发行,募资265亿美元,并已超越阿里巴巴跻身史上第三...
原创 “... 不得不说,小红书在这两年一脚踏入“多事之秋”。 从2025年开始细数,先是8月份,赵露思在小红书连...
跨境电商巨无霸,赴港IPO获证... 来源:上海证券报 7月10日,中国证监会国际合作司发布关于SHEIN Global Holdings...
陪爸妈走过的第四个城市 陪爸妈走过的第四个城市 开篇 今年春天,趁着天气刚刚好,我又带着爸妈出了趟门。算上这次,是陪他们走...
百度沈抖:未来 90% 工作都... “未来90%的工作,都可能有智能体深度参与、协助完成。”在百度AIDAY百度搭子专场上,百度集团执行...
港股风向标|恒指短线放量滞涨 ... 财联社7月10日讯(编辑 冯轶)今日港股再度冲高回落,三大指数午后集体走弱。截至收盘,恒生指数、国企...
MLCC周期全面爆发!风华高科... 7月10日,国内被动元件龙头风华高科(000636.SZ)披露2026年半年度业绩预告,上半年净利润...
关停杠杆炒金!银行个人贵金属代... 今年6月以来,交通银行、招商银行、工商银行、建设银行等多家银行相继发布公告,宣布将于7月下旬起停办代...
原创 许... 许家印当年为何跟黄有龙搞在一起?背后到底有何猫腻?许家印跟黄有龙堪称是中国资本市场的两大奇人。一个凭...
世界杯第29日前瞻:西班牙vs... 北京时间7月11日凌晨3点,2026年美加墨世界杯进入第29个比赛日的争夺,将展开第二场1/4决赛争...