闭包和装饰器
闭包 当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值时,相关参数和变量保存在返回的函数中,这种结果叫闭包。 # 闭包结构,myF5用到了myF4的参数args def myF4 ( * args ) : def myF5 ( ) : rst = 0 for n in args : rst += n return rst return myF5 # 常见的闭包错误 def count ( ) : # 定义列表,列表里存放的是定义的函数 fs = [ ] for i in range ( 1 , 4 ) : # 定义了一个函数f # f是一个闭包结构 def f ( ) : return i * i fs . append ( f ) return fs f1 , f2 , f3 = count ( ) print ( f1 ( ) ) print ( f2 ( ) ) print ( f3 ( ) ) # 此时的输出会是9,9,9,并不是我们想要的1,4,9 造成上述状况的原因是,返回函数引用变量i,i并非立即执行,而是等到三个函数都返回的时候才统一使用,此时i已经变成了3,最终调用的时候,都是返回3*3 此问题描述成: 返回闭包时,返回函数不能引用任何循环变量 解决方案: 用函数的参数绑定循环变量的当前值,无论该循环变量以后如何改变