python进阶系列学习(三)

python中的闭包

回顾上一节返回函数:

#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的结果,必须让内存函数的变量不随着外层函数变化而变化,或者直接就在内层函数中先计算出来,用一个变量存储~

你可能感兴趣的:(python_practice)