美文网首页
闭包的总结

闭包的总结

作者: Jornathon | 来源:发表于2017-10-31 17:07 被阅读0次

我们在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)

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

注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用。

当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数:

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

调用函数f时,才真正计算求和的结果:

>>> f()
25

另一个需要注意的问题是,返回的函数并没有立刻执行,而是直到调用了f()才执行。我们来看一个例子:

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

在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。

你可能认为调用f1(),f2()f3()结果应该是1,4,9,但实际结果是:

>>> f1()
9
>>> f2()
9
>>> f3()
9

如果对count()函数进行修改:

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

在闭包中,使用f时,函数内的函数体并未执行,而是在count()运行结束后,再次回到f中实现该函数;
f()则表示,在count()函数内执行f()函数。

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

>>> def count():
...         fs = []
...         def f(i):
...                 return lambda :i*i
...         for n in range(1, 4):
...                 fs.append(f(n))
...         return fs
... 
>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9

相关文章

  • Gradle开发-Groovy闭包

    # 闭包 闭包的基础知识 闭包的使用 闭包 this,owner,delegate 的理解 总结 ## 闭包的基础...

  • 2020-12-08

    总结 一、闭包 闭包:当一个函数使用作用域外部变量,这个函数就是闭包例: 闭包的用途: 1. 储存变量:保存外部函...

  • 作用域和闭包

    目录 概述 作用域编译过程词法作用域全局作用域函数作用域 闭包循环和闭包闭包的用途性能 总结 概述 作用域和闭包一...

  • 闭包的总结

    围绕:闭包是什么?闭包的用途有哪些?闭包的缺点是什么? 这三个问题来进行总结 一、何为闭包?如果一个函数用到了外部...

  • 自动闭包/逃逸闭包/非逃逸闭包

    自动闭包、逃逸闭包和非逃逸闭包三个概念有些不好理解,这里按我自己的理解总结一下,不对的地方请指正 一、非逃逸闭包:...

  • JS进阶系列之闭包(2)

    刚刚总结完作用域链,我觉得很有必要马上对闭包总结一下,因为,之前也写过自己对闭包的理解,那时候只知道,闭包就是可以...

  • 闭包的总结

    我们在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变...

  • 理解闭包、立即执行函数、异步和回调

    闭包 什么是闭包 一个函数使用了它外面的变量,这种用法就是闭包。闭包是一个马后炮的总结。 那为何要这样做呢(搞得这...

  • Javascript 闭包和递归

    本篇是关于自己对于JS学习闭包和递归的学习和总结 , 大部分为引用 , 部分案例自己总结 。 1.1 闭包(cl...

  • Swift学习:闭包

    本篇将详细总结介绍Swift闭包的用法;闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift中的闭包与C...

网友评论

      本文标题:闭包的总结

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