1、闭包git
1.定义:当一个函数在内部定义函数,而且内部的函数应用外部函数的参数或者局部变量,当内部函数被当作返回值的时候,相关参数和变量保存在返回的函数之中,这种结果,叫作闭包。github
2.例子:连载17中的myF4就是一个典型的例子。微信
3.闭包常见的坑闭包
def count(): #定义列表 fs = [] for i in range(1,4): def f(): return i*i fs.append(f) #按照咱们的预期,应该是fs=[f,f,f].其中f中一次包含1,4,9,这样才对,但实际结果不是,我么接着看 return fs f1,f2,f3 = count() print(f1(),f2(),f3())
不是咱们预期的1 4 9。app
(1)缘由分析:返回函数引用了变量i,i并不是当即执行,而是等到三个函数都返回的时候才统一执行,此时i已经变为3,最终调用的时候却反回了3*3.函数
(2)总结:返回闭包的时候,返回函数不能引用任何循环变量了学习
(3)解决方案:再建立一个函数,用该函数的参数绑定循环变量的当前值,不管该循环变量之后如何改变,已经绑定的函数参数值不变。大数据
改进代码:ui
def count2(): def f(j): def g(): return j*j return g fs = [] for i in range(1,4): fs.append(f(i)) #咱们进行了传参,所以j就固定下来,它就执行了j return fs f4,f5,f6 = count2() print(f4(),f5(),f6())
2、装饰器spa
def hello(): print("我是一个程序") f = hello f() hello() #用id来证实f和hello是一个函数 print(id(f),id(hello))
3、源码:
d20_2_closure_interpretation
地址:https://github.com/ruigege66/Python_learning/blob/master/d20_2_closure_interpretation
2.CSDN:https://blog.csdn.net/weixin_44630050(心悦君兮君不知-睿)
3.博客园:https://www.cnblogs.com/ruigege0000/
4.欢迎关注微信公众号:傅里叶变换,后台回复”礼包“,获取大数据学习资料。