闭包函数
闭包函数
一、基础知识
所谓闭包函数就是定义在函数内部的函数,但是他有一些限制条件:
1、定义在函数内部
2、用到了外部函数名称空间中的名称
def index(): name = 'jason' def inner(): print(name)
二、作用
闭包函数在使用的过程中的作用其实很简单-----是另外一种给函数代码传参的方式!!!
通过之前的学习我们了解到,当函数需要参数的时候我们会在括号内加入他们需要的参数,这是给函数传参的一种方式。第二种方式就是使用闭包函数给其他函数体代码传参。代码举例:
# 给函数代码体传参的方式1:代码里面缺什么变量名形参里面就补什么变量名 def register(name,age): print(f""" 姓名:{name}, 年龄:{age} """) register('wei',20) # 给函数体代码传参的方式2:闭包函数 def outer(name, age): def register(): print(f""" 姓名:{name}, 年龄:{age} """) return register res = outer('jason', 18) res() # 姓名:jason, 年龄:18 res = outer('kevin', 28) res() # 姓名:kevin, 年龄:28
第二种方式就是使用了闭包函数的方式来传参的,由于工作流程有些绕,具体解释:
- 当我们运行代码的时候 会先定义函数,但是不会运行其中的代码
- 接着就到了res代码堆这里,我们需要先看代码右边的内容进行了什么操作
- 第一个res代码运行了outer函数并且给他传入了'jason',18两个参数,之后我们回到代码内部根据流程运行代码,最后发现返回值是register函数名
- 这里我们可以发现第一个res变量名绑定了register函数
- 后面两行代码都是在调用res绑定的当前参数下的register函数,返回的信息就是'jason', 18
- 到了第二次给res变量名赋值的地方,也是一样的判断方式,可以发现在res绑定成了'kevin',28两个参数下的register函数
- 之后又是连续几次调用res绑定的在'kevin', 28两个参数下的register函数,返回的信息也是'kevin', 28
三、案例
def multipliers(): return [lambda x: i * x for i in range(4)] print([m(2) for m in multipliers()])
上述multipliers()函数中的匿名函数可以看作也给闭包函数。
将其改为下面更具可读性:
def multipliers(): seque = [] for i in range(4): tmp = lambda x: i * x seque.append(tmp) return seque print([m(2) for m in multipliers()])
变量i为外部函数的变量,被内部函数(匿名函数)引用,在调用匿名函数的时候,for循环已执行完,因此i均为3,输出结果为:[6,6,6,6].
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构