闭包的定义:

闭包就是一个函数,这个函数可以记住封闭作用域里的值,而不管封闭作用域是否还在内存中。

来一个例子:

  1. def happy_add(a):
  2. print 'id(a): %x' % id(a)
  3. def do_add(b):
  4. return a + b
  5. print 'id(do_add): %x' % id(do_add)
  6. return do_add
  7.  
  8. test_one = happy_add(1)
  9. test_one(9)
  10. print repr(test_one)
  11.  
  12. print '\n------------------\n'
  13.  
  14. test_other = happy_add(3)
  15. del happy_add
  16. test_other(16)
  17. print repr(test_other)

执行结果是:

  1. id(a): 7fae91d05788
  2. id(do_add): 10a94a0c8
  3. <function do_add at 0x10a94a0c8>
  4.  
  5. ------------------
  6.  
  7. id(a): 7fae91d05758
  8. id(do_add): 10a94a6e0
  9. <function do_add at 0x10a94a6e0>

分析:

首先id(x)是求出x在内存中的地址。

两次id(a)不同,说明变量绑定到各自的嵌套函数对象。

每次调用happy_add()会产生不同的对象,会存储在不同的地方。

封闭命名空间删除(del happy_add)也不会影响闭包函数的执行。

就这么一个函数写成class:

  1. class happy_add:
  2. def __init__(self, x, y):
  3. self.x = x
  4. self.y = y
  5.  
  6. def add(self):
  7. return self.x + self.y
  8.  
  9. test_one = happy_add(1, 9)
  10. print test_one.add()

是不是很不美观,有种小题大做的感觉。

闭包的判断:

(1)一个嵌套函数(函数里面的函数)

(2)嵌套函数用到封闭函数里定义的一个或多个值

(3)封闭函数的返回值是嵌套函数

什么时候用闭包:

闭包的好处是避免使用全局变量和提供了数据隐藏的一种可选形式。问题是这些都可以通过class来实现,为什么还要有closure呢?通常,当属性和方法很多的时候用类。反之(大多数情况一个方法),则选择closure,closure会是一个更加优雅简洁的解决方案。

python 闭包(closure)的更多相关文章

  1. python闭包closure

    在讨论闭包之前,先总结一下python的命名空间namespace,一般的语言都是通过namespace来识别名字标识,无论是变量,对象,函数等等.python划分3个名字空间层次,local:局部, ...

  2. Python闭包Closure 2

    由于Python中,变量作用域为LEGB,所以在函数内部可以读取外部变量,但是在函数外不能读取函数内的变量.但是出于种种原因,我们需要读取函数内的变量时候怎么办?那就是在函数内在加一个函数. def ...

  3. python 闭包 Closure 函数作为返回值

    一.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. >>> def lazy_sum(*args): ... def sum(): ... ax = ...

  4. python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)

    1.函数对象 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函 ...

  5. Python 闭包(Closure)

    Python  闭包 (Closure) 这里介绍一下python 的闭包 基本概念 闭包(closure)是函数式编程的重要的语法结构. 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函 ...

  6. 【Python】闭包Closure

    原来这就是闭包啊... 还是上次面试,被问只不知掉js里面的闭包 闭包,没听过啊...什么是闭包 回来查了下,原来这货叫闭包啊...... —————————————————————————————— ...

  7. Python 闭包

    什么是闭包? 闭包(closure)是词法闭包(lexical closure)的简称.闭包不是新奇的概念,而是早在高级程序语言开始发展的年代就已产生. 对闭包的理解大致分为两类,将闭包视为函数或者是 ...

  8. Python闭包与javascript闭包比较

    实例一 python def line_conf(): def line(x): return 2*x+1 print(line(5)) # within the scope     line_con ...

  9. Python闭包与函数对象

    1. Python闭包是什么 在python中有函数闭包的概念,这个概念是什么意思呢,查看Wikipedia的说明如下: “ In programming languages, closures (a ...

随机推荐

  1. linux 用grep匹配横线

    file的内容如下: ADSFADSFSDFASDFJKJK----------------------------------------ADSFADSFSDFASDFJKJK----------- ...

  2. Web开发之tomcat配置及使用(环境变量设置及测试,一个简单的web应用实例)

    Tomcat的配置及测试: 第一步:下载tomcat,然后解压到任意盘符 第二步:配置系统环境变量 tomcat解压到的D盘 (路径为: D:\tomcat), 配置环境变量: 启动tomcat需要两 ...

  3. Android开发之异步消息处理机制Handler

    更加详细的介绍Handler的博文-http://blog.csdn.net/guolin_blog/article/details/9991569 Android中的异步消息处理主要有四个部分组成, ...

  4. php简单实现MVC

    在PHP中使用MVC越来越流行了,特别是在一些开源的框架当中.MVC足以应对大多数的情况,但还有一些情况是其不太适合的,如比较简单的个人博客,对于只有几百篇文章量级的博客,使用MVC让人觉得有些太复杂 ...

  5. Gentoo安装

    Gentoo Linux安装详解--根据官方WiKi整理 时间:2014-06-26 06:37:54      阅读:549      评论:0      收藏:0      [点我收藏+] 标签: ...

  6. RPi 2B 自动发送获取的IP到固定邮箱

    /************************************************************************* * RPi 2B 自动发送获取的IP到固定邮箱 * ...

  7. Dos操作

    \tree/f >c.txt \dir/s/b >c.txt

  8. java jvm学习笔记五(实践自己写的类装载器)

     欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和 ...

  9. java中的快捷键

    Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当 ...

  10. 访问WEB-INF目录中的JSP文件

    方法1:本来WEB-INF中的jsp就是无法通过地址栏访问的.所以安全.如果说你要访问这个文件夹中的jsp文件需要在项目的web.xml文件中去配置servlet格式差不多的配置就ok了.如下: 访问 ...