zoukankan      html  css  js  c++  java
  • Python的闭包

    如果在一个内部函数里, 对在外部作用域(但不是在全局作用域) 的变量进行引用, 那么内部函数就被认为是闭包(closure)。定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量。 

    闭包在函数式编程中是一个重要的概念, SchemeHaskell便是函数式编程中两种。 闭包从语法上看很简单(和内部函数一样简单) 但是仍然很有威力。

    那么为什么你会想要用闭包?
    闭包对于安装计算、 隐藏状态和在函数对象和作用域中随意地切换是很有用的。 

    闭包在GUI或者在很多API支持回调函数的事件驱动编程中是很有些用处的。 以绝对相同的方式, 应用于获取数据库行和处理数
    据。  回调就是函数。 闭包也是函数, 但是他们能携带一些额外的作用域。  它们仅仅是带了额外特征的函数……另外的作用域。
    闭包和函数调用没多少相关, 而是关于使用定义在其他作用域的变量。

    def counter(start_at=0):
        count=[start_at]
        def incr():
            count[0]+=1
            return count[0]
        return incr;
    
    
    if __name__=="__main__":
        
        print(counter(0)())

    counter()做的唯一一件事就是接受一个初始化的值来开始计数, 并将该值赋给列表count唯一一个成员。 然后定义一个incr()的内部函数。
    通过在内部使用变量count, 我们创建了一个闭包, 因为它现在携带了整个counter()作用域。 incr()增加了正在运行的count然后返回它。

    然后最后的魔法就是counter()返回一个incr, 一个(可调用的) 函数对象。 

    注意counter(0)(),counter(0)返回的是incr,一个可调用的函数对象,所以后面加()


    闭包更适合需要一个必需有自己的作用域的回调函数情况, 尤其是回调函数是很小巧而且简单的, 通常也很聪明。 跟平常一样, 如果你使用了闭包, 对你的代码进行注释或者用文档字符串来解释你正做的事是很不错的主意。 【意思是,如果你使用了闭包,就应当加上注释】



  • 相关阅读:
    .NET 应用架构指导 V2 [1]
    MSSQL优化之————探索MSSQL执行计划
    删除代码中所有的空行
    微软企业库5.0学习笔记(一)企业库是什么?
    C# MP3操作类
    Microsoft Enterprise Library 5.0系列学习笔记【1】
    基于Asp.net的CMS系统We7架设实验(环境WIN7,SQL2005,.NET3.5)(初学者参考贴) 【转】
    C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件,有图解
    “Singleton”模式
    阅读技术类图书的思考
  • 原文地址:https://www.cnblogs.com/Sabre/p/8182107.html
Copyright © 2011-2022 走看看