回顾上一节返回函数:
#python中的闭包
def f():
print("我是f()函数")
def g():
print("我是g()函数,是被f()函数调用的")
return g #f()函数返回的就是函数
if __name__=="__main__":
g=f()
print('*'*30)
g()
其实这里的g()可以放在f()函数的外面,没必要非得放里面:
def g():
print("我是函数g(),一会f()函数可能要调用我")
def f():
print("我是函数f(),我一会要调用g()")
return g #返回的是函数
if __name__=="__main__":
g_1=f()
g_1()
然而闭包跟一个函数在另一个函数里面差不多,除此之外,还需要放在里面的那个函数需要用到外层函数的参数:
def f():
fs=[] #存储函数g
for i in range(1,4):
def g():
return i*i
fs.append(g)
return fs
if __name__=="__main__":
f1,f2,f3=f()
print(f1(),f2(),f3())
比如这里内层函数g() 就用到了外层函数f()中的参数变量i,只不过这里的i是一直变化的,最终调用f1(),f2(),f3()时的i已经变为3了,所以最终的结果都是9
题目:
返回闭包不能引用循环变量,请改写count()函数,让它正确返回能计算1x1、2x2、3x3的函数。
啊这一题我没做上来,,,
看了一下答案:
def count():
fs = []
for i in range(1, 4):
j=i*i
def f(j):
def g():
return j
return g
fs.append(f(j))
return fs
f1, f2, f3 = count()
print f1(), f2(), f3()
其实闭包就是内层函数引用了外层函数的变量嘛,所以如果想输出1,4,9的结果,必须让内存函数的变量不随着外层函数变化而变化,或者直接就在内层函数中先计算出来,用一个变量存储~