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

相关内容

热门资讯

黄金珠宝怎么选?内侧刻字都代表... 潮新闻客户端 记者 马焱 通讯员 任倩影 9月8日下午,“云游杭州 乐购金秋”——“浙城·浙放心”活...
原创 冰... 最近全球国债市场正在上演魔幻一幕: 美债、日债、欧债遭遇猛烈抛售,收益率冲到几十年新高,美国财政部都...
日韩股市开盘表现分化 上证报中国证券网讯 9月9日,日韩股市开盘表现分化,韩国综合指数开盘上涨0.26%,报6972.87...
国际原油拉升,中曼石油涨超8%... 9月8日,油气开采及服务板块持续走高, 中曼石油(603619.SH)涨超8%, 石化油服(6008...
宁波银行启动2026年金融教育... 9月7日至13日,宁波银行开展2026年金融教育宣传周。此次活动紧扣“清朗金融网络 守护安心消费”主...
食物发芽后都有毒吗?哪些不能吃... 不少家庭囤放的食材放置一段时间后,悄悄长出了“小芽”。提到食物发芽,大多数人会认为“发芽的食物一般都...
3年9700万美元!骑士官宣与... 搜狐体育消息,北京时间9月9日,骑士官方今日宣布,球队已与哈登续签了一份多年期合同。 骑士官方写道...
农行工行定增2600亿 或于年... 记者 胡艳明 国有大行新一轮资本补充方案落地。 2026年9月7日,农业银行(下称“农行”)、工商银...
9月9日每日研选丨超强厄尔尼诺... 超强厄尔尼诺正成为近期农产品板块走强的核心推手。据美国国家海洋和大气管理局(NOAA)预测,2026...
巨头库存告急,美股光学网络携手... 当地时间9月8日,劳动节长假后的首个交易日,美股三大指数同步走低。标普500指数跌0.58%报767...
原创 A... 9月9日,新股市场迎来洛轴股份(301699)的上市交易。恐怕有些中签的股民已经等急了,因为在同一天...
早报美股光通信,逆市大涨;美袭... 宏观新闻 1、习近平同英国首相伯纳姆通电话。习近平祝贺伯纳姆就任英国首相,指出中英是全面战略伙伴,虽...
原创 “... 备受社会关注的“梅姨案”有了最新消息。9月8日下午,“梅姨”案被拐人申聪和父亲申军良及其代理律师面向...
哪些人群适合选择北方地区熏鸡加... 当前国内小成本餐饮赛道发展平稳,熟食类项目因客群覆盖广、投入门槛低、操作难度可控,成为不少创业者的选...
央视报道丨2026年服贸会首批... 央视《新闻联播》(2026年9月7日) 记者:张萍、叶奂 央视《朝闻天下》(2026年9月8日) 记...
原创 美... 近期,国际能源地缘格局迎来重大变动。 美国通过全新合作协议深度切入委内瑞拉石油产业,调整当地多年形成...
住院后突然糊涂?元凶不是年龄,... 住院后突然糊涂,真的是年纪大了么?很多人第一反应是把谵妄归因于年龄,但最近的一项权威研究给出一个更清...
消费新势力|山东省代表团参加第... 9月8日,第26届中国国际投资贸易洽谈会在福建厦门开幕,活动由商务部主办,是我国对外开放的重要窗口和...
消金公司半年考:头部缩表控险,... 来源:市场资讯 华夏时报记者 付乐 北京报道 近期,已开业的31家消费金融公司中,多家机构披露了2...
三星Q3大幅增加HBM4供应,... 每经编辑:肖芮冬 截至9时40分,市场震荡活跃,同指数费率最低标的科创芯片ETF(588290)跟踪...