闭包函数
闭包函数:内部函数(包含)对外部作用域而非全剧作用域变量的引用,该内部函数(函数内部定义的函数称为内部函数)称为闭包函数
闭包只存在于内层函数中。
函数都要逐层返回,最终返回给最外层函数。
由于有了作用域的关系,我们就不能拿到函数内部的变量和函数了。如果我们就是想拿怎么办呢?返回呀!
我们都知道函数内的变量我们要想在函数外部用,可以直接返回这个变量,那么如果我们想在函数外部调用函数内部的函数呢?直接就把这个内部函数的名字返回
一下是闭包函数最常用的用法
def func(): name='python' def inner(): print(name) return inner f=func() f()
结果为:python
1 判断是否是闭包函数
f.__closure__[0].cell_contents
如果有返回值,则说明是闭包函数,如果不是闭包函数会报错。
1.1 获取闭包引用的外层变量
def func(): name = 'python' author='龟叔' def inner(): print(name) print(author) return inner f = func()
# 获取闭包引用的外层变量
print(f.__closure__[0].cell_contents) print(f.__closure__[1].cell_contents)
结果为:
龟叔
python
1.2 不是闭包的示例
name = 'alex' def func(): def inner(): print(name) return inner f = func() print(f.__closure__[0].cell_contents)
运行会报错
Traceback (most recent call last): File "E:/python/test10.py", line 14, in <module> print(f.__closure__[0].cell_contents) TypeError: 'NoneType' object is not subscriptable
2 闭包的应用:
解释器执行程序时,如果遇到函数,随着函数的结束而关闭临时名称空间,
但是 如果遇到闭包,有一个机制:那么闭包的空间不会随着函数的结束而关闭。
# 1,装饰器。
# 2,爬虫。
def wrapper(step): num = 1 def inner(): nonlocal num num += step print(num) return inner f = wrapper(3) j = 0 while j < 5: f() # inner() j += 1
结果为:
4 7 10 13 16
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)