python 闭包(closure)
闭包的定义:
闭包就是一个函数,这个函数可以记住封闭作用域里的值,而不管封闭作用域是否还在内存中。
来一个例子:
def happy_add(a):
print 'id(a): %x' % id(a)
def do_add(b):
return a + b
print 'id(do_add): %x' % id(do_add)
return do_add test_one = happy_add(1)
test_one(9)
print repr(test_one) print '\n------------------\n' test_other = happy_add(3)
del happy_add
test_other(16)
print repr(test_other)
执行结果是:
id(a): 7fae91d05788
id(do_add): 10a94a0c8
<function do_add at 0x10a94a0c8> ------------------ id(a): 7fae91d05758
id(do_add): 10a94a6e0
<function do_add at 0x10a94a6e0>
分析:
首先id(x)是求出x在内存中的地址。
两次id(a)不同,说明变量绑定到各自的嵌套函数对象。
每次调用happy_add()会产生不同的对象,会存储在不同的地方。
封闭命名空间删除(del happy_add)也不会影响闭包函数的执行。
就这么一个函数写成class:
class happy_add:
def __init__(self, x, y):
self.x = x
self.y = y def add(self):
return self.x + self.y test_one = happy_add(1, 9)
print test_one.add()
是不是很不美观,有种小题大做的感觉。
闭包的判断:
(1)一个嵌套函数(函数里面的函数)
(2)嵌套函数用到封闭函数里定义的一个或多个值
(3)封闭函数的返回值是嵌套函数
什么时候用闭包:
闭包的好处是避免使用全局变量和提供了数据隐藏的一种可选形式。问题是这些都可以通过class来实现,为什么还要有closure呢?通常,当属性和方法很多的时候用类。反之(大多数情况一个方法),则选择closure,closure会是一个更加优雅简洁的解决方案。
python 闭包(closure)的更多相关文章
- python闭包closure
在讨论闭包之前,先总结一下python的命名空间namespace,一般的语言都是通过namespace来识别名字标识,无论是变量,对象,函数等等.python划分3个名字空间层次,local:局部, ...
- Python闭包Closure 2
由于Python中,变量作用域为LEGB,所以在函数内部可以读取外部变量,但是在函数外不能读取函数内的变量.但是出于种种原因,我们需要读取函数内的变量时候怎么办?那就是在函数内在加一个函数. def ...
- python 闭包 Closure 函数作为返回值
一.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. >>> def lazy_sum(*args): ... def sum(): ... ax = ...
- python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)
1.函数对象 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函 ...
- Python 闭包(Closure)
Python 闭包 (Closure) 这里介绍一下python 的闭包 基本概念 闭包(closure)是函数式编程的重要的语法结构. 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函 ...
- 【Python】闭包Closure
原来这就是闭包啊... 还是上次面试,被问只不知掉js里面的闭包 闭包,没听过啊...什么是闭包 回来查了下,原来这货叫闭包啊...... —————————————————————————————— ...
- Python 闭包
什么是闭包? 闭包(closure)是词法闭包(lexical closure)的简称.闭包不是新奇的概念,而是早在高级程序语言开始发展的年代就已产生. 对闭包的理解大致分为两类,将闭包视为函数或者是 ...
- Python闭包与javascript闭包比较
实例一 python def line_conf(): def line(x): return 2*x+1 print(line(5)) # within the scope line_con ...
- Python闭包与函数对象
1. Python闭包是什么 在python中有函数闭包的概念,这个概念是什么意思呢,查看Wikipedia的说明如下: “ In programming languages, closures (a ...
随机推荐
- android下升级软件介绍
编译android: 生成:system.img,ramdisk.img,userdata.img映像文件. ramdisk.img是emulator的文件系统 system.img包括了主要的包.库 ...
- C#中的多文档的使用
1.首先,新建一个窗体,设置窗体的IsMdiContainer = true; 窗体的大小为700*600 长700 高600 2.在窗体的Load事件中添加如下代码 private void F ...
- Oracle EBS Report 输出字符字段前部"0"被Excel自动去掉问题
Oracle EBS 提供多种报表的开发和输出形式,由于MS Excel在处理数据方面的优势明显,报表输出用Excel打开是很常见的开发项. 但是正是由于Excel的"过于智能而不智能&q ...
- ubuntu查看命令
以非root用户更新系统 sudo: sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等.这样不仅减少了root用 ...
- Unity NGUI弧形血条的制作
unity版本:4.6 NGUI版本:3.6. (转载请注明参考链接及作者) 参考链接:http://www.cnblogs.com/louissong/p/3841656.html,作者:博客园 L ...
- poj 1924 Paths on a Grid(组合数学)
题目:http://poj.org/problem?id=1942 题意:给定一个矩形网格的长m和高n,其中m和n都是unsigned int32类型,一格代表一个单位,就是一步,求从左下角到右上角有 ...
- BZOJ_1031_[JSOI2007]_字符串加密_(后缀数组)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1031 长度为n的字符串形成环,枚举开头位置,得到n个长度为n的串,将这些串排序,然后按照顺序输 ...
- [swustoj 1091] 土豪我们做朋友吧
土豪我们做朋友吧(1091) 问题描述: 人都有缺钱的时候,缺钱的时候要是有个朋友肯帮助你,那将是一件非常幸福的事情.有N个人(编号为1到N),一开始他们互相都不认识,后来发生了M件事情,事情分为2个 ...
- nginx多域名的配置方法
方法一:多个.conf方法 1. 到/usr/local/nginx/ 新建一个目录 vhosts 并创建两个conf文件,如:wodejj.com.conf ,xiaobing.com.conf. ...
- listview使用总结
1. android给listview的item设定高度 原文网址:http://blog.csdn.net/l_serein/article/details/7403992 在item的layout ...