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

相关内容

热门资讯

原创 泽... 2026年2月,原本由西方国家主导的慕尼黑安全会议,突然间发生了一次令人震惊的转折:乌克兰外长瑟比加...
原创 大... 大年初二,全国金店的柜台前挤满了人,但气氛和春节前完全不一样。 前几天还是“不问价直接下手”的抢购潮...
超越比尔盖茨!Meta CEO... 快科技2月19日消息,之前比尔盖茨宣布,将自己个人的大部分财富捐出引起了不小的关注,而现在又一位大佬...
南昌第五医院甲状腺科江辉:关于... 甲状腺疾病在内分泌系统疾病中位居第二大危害,因此,在孕前检查中应将其作为重点关注对象。女性甲状腺疾病...
电影、长剧、短剧,决战2026... 文 | 文娱先声 马年春节倒计时,2026年春节档战况持续胶着中。 尤其是今年的春假假期长达9天(...
原创 春... 春躁心不躁——丙午马年开年股市前瞻今天是2026年2月19日,距离丙午马年A股开市还有不到一周的时间...
又一春节档大IP养成:《飞驰人... 蓝鲸新闻2月18日讯(记者 赵凯)2026年春节档进行不到两天,冠军基本已经提前被上海出品的电影《飞...
河南超过16万基层卫生技术人员... 基层卫生技术人员培训是提升基层医疗卫生服务能力的关键抓手,2025年河南省卫生健康委组织完成了超过1...
省委书记、省长的大年初一 政知见消息,干部在岗,群众过节。春节万家团圆的背后,是各级有关部门和工作人员值班值守,把各项服务保障...
韩文秀:拓展内需增长新空间 做... 来源:格隆汇APP 格隆汇2月16日|据求是网消息,中央财办分管日常工作的副主任、中央农办主任韩文秀...
春晚机器人集体“炸场”:看似科... 2月16日除夕夜,当全国观众聚焦央视春晚的明星阵容时,另一批“特殊嘉宾”凭实力抢镜——魔法原子、银河...
抓主升靠趋势,看行为比持仓 很多投资者都有过类似经历:手中标的浮亏时能长期持有,稍有浮盈就急于离场,眼睁睁看着后续行情冲高,只能...
法国国家银行账户档案系统遭非法... 法国经济和财政部当地时间18日在一份公报中指出,自2026年1月底起,有人冒用一名公务员的登录凭证,...
谷歌再掀AI战火:Gemini... 来源:市场资讯 (来源:财联社) 财联社2月19日讯(编辑 赵昊)周三(2月18日)美股盘中,谷歌在...
新生儿护理10个小常识 宝爸宝... 新生儿机体非常娇嫩,软软糯糯的样子让人不知道该怎么照顾,害怕一不留神就对宝宝产生伤害。别担心,本文将...
【朝医新闻】国际医疗部成功举办... 2026年2月5日,北京朝阳医院国际医疗部成功举办“商业健康保险开放日”活动。本次活动旨在推动商业健...
寒假来河南省科技馆体验健康新玩... 本报讯(全媒体记者 曹聪) “小朋友,抬头挺胸,让叔叔看看你的脊柱有没有长歪。”2月7日,河南省科技...
2026江西余干结石科诊疗机构... 一、行业背景与筛选依据 据《2025中国泌尿系结石诊疗现状白皮书》数据显示,我国泌尿系结石发病率已达...