python中的闭包(python基础学习)

学习python的闭包之前需要先知道python的返回函数。

python的返回函数

python中不仅可以返回int、str、list等数据,还可以返回函数。返回函数和返回函数值不同。

返回函数有延迟执行的效果。返回值是立即被执行给出结果。返回函数可以在需要执行的时候再调用函数执行。

例:编写函数calc_prod,它接收一个list,返回一个函数。返回函数可以计算参数的累积。

def calc_prod(lst):
    def lazy_prod():
        def f(x,y):
            return x*y
        return reduce(f,lst)
    return lazy_prod
    
f = calc_prod([1,2,3,4])
print f  # 返回一个函数
print f()  # 返回函数值

python中的闭包

内层函数引用了外层函数的变量,然后返回内层函数的情况,称之为闭包。

闭包的特点是返回的函数还使用了外部函数的局部变量,所以要正确的使用闭包,就要确保引用的局部变量在函数返回后不能变。

例如:希望一次返回3个函数,分别计算1*1,2*2,3*3

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()
print f1()  # 9
print f2()  # 9
print f3()  # 9

因为内部函数引用的外部函数的局部变量i在函数返回后值已经改变,所以此处返回的全是9。我们可以将f()函数先看成一个黑盒子,里面具体返回什么信息先不管。在调用函数count()时,i分别等于1、2、3,将3个函数添加到fs中并返回。此时i等于3。然后我们在分别调用3个刚刚返回的f()函数,注意,此时的i已经等于3了。再调用f1()、f2()、f3(),结果均为9。(此处比较抽象,建议先将内部函数f看成一个黑盒子,先不关心具体的内容。)

可以改写函数为:引用一个不变的局部变量。

def count(i):
    def f():
        return i*i
    return f
    
f1 = count(1)
f2 = count(2)
f3 = count(3)
print f1(),f2(),f3() # 1 4 9

f1,f2,f3 = map(count,range(1,4))
print f1(),f2(),f3()  # 1 4 9
def count():
    fs = []
    for i in range(1, 4):
        def f(j):
            def g():
                return j*j
            return g
        r = f(i)
        fs.append(r)
    return fs
f1, f2, f3 = count()
print f1(), f2(), f3()


猜你喜欢

转载自blog.csdn.net/loner_fang/article/details/80864435
今日推荐