python 函数闭包()

闭包(closure)

 当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回函数中,这种结果,叫闭包

example1:

 1 def test(*args):
 2     
 3     def test_1():
 4         rst = 0
 5         for i in args:#这里使用了函数外部的参数
 6             rst += i
 7         return rst
 8     return test_1#将函数作为返回值返回,相关参数和变量保存在返回的函数中
 9 
10 a = test(1,2,3)
11 print(a())

 这上面就是一个常见的闭包

 

闭包也有坑人的地方

example2:

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
# [Finished in 0.2s]
# 为什么会是999呢,造成上述状况的原因是,返回函数引用了变量i,
# 而i并不是立即执行,而是等腰三个函数都返回的时候才统一执行
# 此时i已经变成了3,最终调用的时候 返回的都是 3*3
# 

上述问题得到结果: 返回闭包时,不能引用任何循环变量

解决办法:

再在外面套一个函数

example3:

def count2():
    fs = []
    #这里定义了一个列表
    def f(i):#将i作为参数传入进去
        def g():
            return i*i#这里i返回的时候会马上执行
        return g

    for i in range(1,4):
        fs.append(f(i))
    return fs
f1,f2,f3 = count2()
print(f1())
print(f2())
print(f3())
#1
#4
#9

 

posted @ 2018-09-07 11:47  lonelyshy  阅读(287)  评论(0编辑  收藏  举报