美文网首页
浅谈python的闭包

浅谈python的闭包

作者: 刘圣凯 | 来源:发表于2019-03-04 15:58 被阅读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
    

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

    相关文章

      网友评论

          本文标题:浅谈python的闭包

          本文链接:https://www.haomeiwen.com/subject/weeiuqtx.html