一、闭包
1.定义:当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回的函数之中,这种结果,叫做闭包。
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。
(1)原因分析:返回函数引用了变量i,i并非立即执行,而是等到三个函数都返回的时候才统一执行,此时i已经变为3,最终调用的时候却反回了3*3.
(2)总结:返回闭包的时候,返回函数不能引用任何循环变量了
(3)解决方案:再创建一个函数,用该函数的参数绑定循环变量的当前值,无论该循环变量以后如何改变,已经绑定的函数参数值不变。
改进代码:
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())
二、装饰器
def hello():
print("我是一个程序")
f = hello
f()
hello()
#用id来证明f和hello是一个函数
print(id(f),id(hello))