代码拉取完成,页面将自动刷新
####闭包:
#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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。