浅谈python的闭包

2019-03-04  本文已影响0人  刘圣凯

今天在学习python的时候学到了返回函数,这里先说一下返回函数,一个求和函数,如果不需要马上调用,我们可以使用返回函数

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

这样当我们调用 lazy_sum() 时,返回的并不是结果,还是一个求和函数,

>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>

当我们调用 f()时,才真正计算求和结果,
看到这里是不是很熟悉,在这个例子中,我们在函数 lazy_sum 中又定义了函数 sum ,并且,内部函数 sum 可以引用外部函数lazy_sum 的参数和局部变量,当 lazy_sum 返回函数 sum 时,相关参数和变量都保存在返回的函数中,并且例子中的 f 并没有马上执行, 没错 ,这就是我们熟悉的闭包了

记住,返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值(即创建一个新的作用域),无论该循环变量后续如何更改,已绑定到函数参数的值不变

def count():
    def f(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
    return fs

闭包是语言的一种特性,再次提醒, 返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

上一篇 下一篇

猜你喜欢

热点阅读