1 Star 0 Fork 0

读梦人/python_study

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
018-闭包 1.81 KB
一键复制 编辑 原始数据 按行查看 历史
读梦人 提交于 2023-08-20 02:15 . add 018-闭包.
####闭包:
#0、概念理解:
1)闭包也是函数;
2)闭包区别于函数:因为它可访问定义体之外的函数——自由变量;
3)函数无法记录上次执行结果,通过闭包可以实现结果集 累积,进行迭代运算。
#1、结构:
In [1]: def make_avg():
...: values = [] #自由变量
####闭包START
...: def avg(new_values): #函数内定义函数
...: values.append(new_values)
...: return sum(values) / len(values) #return闭包函数结果
...: return avg #return闭包函数给外层函数
####闭包END
...:
In [2]: avg = make_avg()
In [3]: avg(1)
Out[3]: 1.0
In [4]: avg(2)
Out[4]: 1.5
In [5]: avg(3)
Out[5]: 2.0
In [6]:
#2、有用方法,查看变量信息
###获取avg函数中的局部变量
In [6]: avg.__code__.co_varnames
Out[6]: ('new_values',)
###获取avg函数中的自由变量
In [7]: avg.__code__.co_freevars
Out[7]: ('values',)
In [8]:
###获取avg函数中的自由变量值
In [10]: avg.__closure__[0].cell_contents
Out[10]: [1, 2, 3]
#3、常见其它方式实现闭包
In [13]: def f():
...: count = 0
...: total = 0
...: def f2(new_value):
...: nonlocal count,total #声明count、total为自由变量,否则python会认为是局部变量但未声明而报错
...: total = total + new_value
...: count += 1
...: return total / count #函数f2 return结果
...: return f2 #闭包返回f2函数给函数f
...:
In [14]: a = f()
In [15]: a(5)
Out[15]: 5.0
In [16]: a(6)
Out[16]: 5.5
In [17]: a(7)
Out[17]: 6.0
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/w854090472/python_study.git
git@gitee.com:w854090472/python_study.git
w854090472
python_study
python_study
master

搜索帮助