Python闭包与函数对象
1. Python闭包是什么
在python中有函数闭包的概念,这个概念是什么意思呢,查看Wikipedia的说明如下:
“
In programming languages, closures (also lexical closures or function closures) are a technique for implementing lexically scoped name binding in languages with first-class functions. Operationally, a closure is a record storing a function[a] together with an environment:[1] a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or storage location to which the name was bound when the closure was created.[b] A closure—unlike a plain function—allows the function to access those captured variables through the closure's reference to them, even when the function is invoked outside their scope.
” —— 原文链接:https://en.wikipedia.org/wiki/Closure_(computer_programming)
看上去概念很多,下面我们通俗的讲一下
假设我有个求x^n的函数如下
def pow(x, n):
res = 1
for i in range(n):
res *= x
return res
(例1)
在某一段代码里,我总是用到平方和(比如求矩形对角线的时候),那我的代码是
len2d = pow(20,2) + pow(30,2)
这时候我希望第二个参数总是取2,不用重复写
在另一段代码里,我总是用到立方和(比如求正方体对角线的时候),那我的代码又变成
len3d = pow(20,3) + pow(30,3) + pow(40,3)
这个时候我希望第二个参数固定为3
在上面这两种情况里,函数闭包就有了用武之地:
def pown(n):
def pow(x):
res = 1
for i in range(n): # 引用外围函数状态
res *= x
return res
return pow
pow2 = pown(2)
len2d = pow2(20) + pow2(30)
pow3 = pown(3)
len3d = pow3(20) + pow3(30) + pow3(40)
(例2)
从例2我们看到,pown是外围函数,它传入了一个参数n,并且返回了一个内部函数。pow就是python中的闭包函数,它不但有自己的执行逻辑,也能引用到参数n。
这就是闭包函数和普通函数最大的不同,闭包函数除了函数执行体,还“闭包”了外围状态。每个闭包函数实例都能“闭包”各自的状态。
2. 闭包和函数对象
如果要把闭包和c++做个对比,应该类似于c++中的函数对象。函数对象用python来实现的代码如下:
class Pow(object):
def __init__(self, n):
self.n = n
def __call__(self, x):
res = 1
for i in range(self.n): # 引用对象成员
res *= x
return res pow2 = Pow(2)
len2d = pow2(20) + pow2(30) pow3 = Pow(3)
len3d = pow3(20) + pow3(30) + pow3(40)
(例3)
例3的类中定义了特殊方法__call__,因此它的对象能被直接做函数调用,称之为函数对象。由于它是一个对象,因此在初始化的时候可以传入参数进行保存,这点就类似于之前提到的闭包的概念。
从这个类比来看,闭包可以近似的看成是简化的函数对象
关键字:Python, 闭包,函数对象
Python闭包与函数对象的更多相关文章
- Python中的函数对象与闭包
函数在Python中是第一类对象,可以当做参数传递给其他函数,放在数据结构中,以及作为函数的返回结果. 下面的例子为接受另外一个函数作为输入并调用它 #foo.py def callf(func): ...
- python中的函数对象与闭包函数
函数对象 在python中,一切皆对象,函数也是对象 在python语言中,声明或定义一个函数时,使用语句: def func_name(arg1,arg2,...): func_suite 当执行流 ...
- Python进阶07 函数对象
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函数也是一个对象 ...
- python基础之函数对象,嵌套,名称空间和作用域
函数对象: 函数是第一类对象的含义是函数可以被当作数据处理 函数可用于: def func(): print(‘func’) 1.引用 f = func 把内存地址赋值给f 2.当作参数传给一个函 ...
- python中的函数对象的内存地址是多少
今天和同学讨论一个问题,发现了函数的内存地址和我想象的不一样. 我以为同一个函数,假如给的参数不一样,那么这两个函数的id就不一样. 然后经过实验,发现python为了便于管理函数,所有的函数都放在同 ...
- Python中通过函数对象创建全局变量
先看下面这段代码,显然无法work. 因为代码试图在TestVariableScope()中引用一个没有被定义的变量a.所以必须报错,如下图-1. 不过如果你将第2行代码注释掉.代码就能跑通了,如图- ...
- Python 进阶 之 函数对象
Python的世界里,万物皆对象,函数当然也是: 首先要定义一个函数: def add(a,b): print a+b 其次定义一个字典来引用该函数: dic = {"add":a ...
- python入门之函数对象
目录 函数是第一类对象 1.函数名可以被引用 2.函数名可以当做参数传递 3.函数名可以当做返回值使用 4.函数名可以被当做容器类型的元素 函数是第一类对象 First-Class Object : ...
- python 闭包 Closure 函数作为返回值
一.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. >>> def lazy_sum(*args): ... def sum(): ... ax = ...
随机推荐
- iframe切换内容页仍然能自适应大小代码(含js)
function setIframeHeight(iframe) { if (iframe) { var iframeWin = iframe.contentWindow || iframe.cont ...
- 原生js实现轮播
1,效果图 https://ga20.github.io/slider/ 2,原理图 分三步: 将视口元素设置overflow:hidden 将其图片子元素设置float:left 让橙色的框(包裹) ...
- 设计模式&UML学习
1. 1.1 1.2 2. 2.1 2.2 3.参考文档 [1] 陈金荣:http://blog.csdn.net/cjr15233661143/article/details/8532997 [2] ...
- android实现文本复制到剪切板功能(ClipboardManager)
Android也有剪切板(ClipboardManager),可以复制一些有用的文本到剪贴板,以便用户可以粘贴的地方使用,下面是使用方法 注意:导包的时候 API 11之前: android.te ...
- Android学习之路——Android四大组件之activity(二)数据的传递
上一篇讲了activity的创建和启动,这一篇,我们来讲讲activity的数据传递 activity之间的数据传递,这里主要介绍的是activity之间简单数据的传递,直接用bundle传递基本数据 ...
- 计算机网络VLAN学习
首先要搞明白VLAN的由来,为什么会产生这样一种技术.这得从计算机网络的数据交换说起,最开始,我们的网络处于蛮荒时代,数据是怎么交换的,就是简单的介质共享,大家都接到一条线路上,然后互相发数据,这个必 ...
- [Javascript] Intro to Recursion - Detecting an Infinite Loop
When using recursion, you must be mindful of the dreaded infinite loop. Using the recursive function ...
- HTML5 格式化、样式、链接、表格
HTML格式化.样式.链接.表格的使用举例
- C#操作iframe
<iframe id="cl" name="clf" src="xianshi.aspx" runat="server&qu ...
- JSONP的客户端的具体实现
JSONP的客户端的具体实现 1.远程调用一个js,代码如下: <script type="text/javascript"> var ...