[python]闭包到底是什么鬼?
这些东西是我在慕课网,廖雪峰大神的python课中学到的。自己写成笔记的形式分享给大家。
先来看一段代码:
def f1(x):
return x*x def new_fn(f):
def fn(j):
print 'print'+f.__name__
return f(j)
return fn g1 = new_fn(f1)
print g1(5)
运行结果:
printf1
25
1.为什么会用到闭包?
在不修改f1函数的前提下,输出f1函数的名称
2.闭包是个什么鬼?
new_fn()函数传入一个参数f(f是一个函数),new_fn()中有一个fn()函数,这个就是增加参数功能的地方。
fn()函数可以使用new_fn()函数接收的参数f。
3.实例化的时候g1 其实就是函数fn()(不准确但是好理解),传入的参数f1就是要增加功能的函数。
这里需要注意的是,g1是一个函数名,加上()就能当作函数来用了。(因为fn返回的是一个函数对象)
总结:
a.闭包就是为了不动原函数里面的代码,还要给它增加‘性功能’的一种手段。
b.通过外面的一层层的函数传递的参数,让最内层的函数可以直接调用外层函数所有参数,从而实现不动原函数的代码,增加新功能的办法。
最后,在python中,修饰器就是最好的体现:
看一段代码:
实现输出传入参数运行了多长时间,并输出,时间单位是传入的参数。
import time def performance(unit):
def performance_decorator(f):
def p(x):
t1 = time.time()
r = f(x)
t2 = time.time()
print 'call %s() in %f %s' % (f.__name__, t2 - t1, unit)
return r
return p
return performance_decorator
@performance('ms')
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10)
[python]闭包到底是什么鬼?的更多相关文章
- Python 闭包小记
闭包就是能够读取其他函数内部变量的函数.例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“.在本质上,闭包是将函数内部和函数外部连接起来 ...
- 理解Python闭包概念
闭包并不只是一个python中的概念,在函数式编程语言中应用较为广泛.理解python中的闭包一方面是能够正确的使用闭包,另一方面可以好好体会和思考闭包的设计思想. 1.概念介绍 首先看一下维基上对闭 ...
- 学Python后到底能干什么?
Python是一种什么语言? Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的Jav ...
- Python 闭包
什么是闭包? 闭包(closure)是词法闭包(lexical closure)的简称.闭包不是新奇的概念,而是早在高级程序语言开始发展的年代就已产生. 对闭包的理解大致分为两类,将闭包视为函数或者是 ...
- JavaScript的“闭包”到底是什么
在JavaScripot函数闭包的定义中,一般都有一个outer 函数,一个inner函数.那么“闭包”到底是指outer函数呢,还是指inner函数? 从官方定义来看,并不清楚:A closure ...
- Python闭包与函数对象
1. Python闭包是什么 在python中有函数闭包的概念,这个概念是什么意思呢,查看Wikipedia的说明如下: “ In programming languages, closures (a ...
- Python闭包及装饰器
Python闭包 先看一个例子: def outer(x): def inner(y): return x+y return innder add = outer(8) print add(6) 我们 ...
- Python闭包详解
Python闭包详解 1 快速预览 以下是一段简单的闭包代码示例: def foo(): m=3 n=5 def bar(): a=4 return m+n+a return bar >> ...
- Python闭包及其作用域
Python闭包及其作用域 关于Python作用域的知识在python作用域有相应的笔记,这个笔记是关于Python闭包及其作用域的详细的笔记 如果在一个内部函数里,对一个外部作用域(但不是全局作用域 ...
随机推荐
- 关于启明星系统移除apppath配置,让系统自动获取路径来设置cookie的解决方法
启明星系统底层使用统一接口,特别是用户,用户登录后,都会建立一个 userinfo 的cookie.请看下面2个网址: http://120.24.86.232/book http://120.24. ...
- 一個小技巧讓ipad或iphone的瀏覽器也能開啟firebug
首先複製這一段代碼 javascript:(function(F,i,r,e,b,u,g,L,I,T,E){if(F.getElementById(b))return;E=F[i+'NS']& ...
- 禁用iOS的UIView长按默认操作
* { -webkit-touch-callout: none; -webkit-user-select: none; -webkit-tap-highlight-color: rg ...
- SFTP+OpenSSH+ChrootDirectory设置
账户设置 SFTP的账户直接使用Linux操作系统账户,我们可以用useradd命令来创建账户. 首先建立3个要管理的目录: 1 2 3 mkdir /home/sftp/homepage mkd ...
- Apache Storm 的历史及经验教训——Nathan Marz【翻译】
英文原文地址 中英文对照地址 History of Apache Storm and lessons learned --项目创建者 Nathan Marz Apache Storm 最近成为了ASF ...
- iOS中的webView加载HTML
在日常开发中,我们为了效率会用到很多很多的WebView,比如在做某个明细页面的时候我们返回给你的可能是一个html字符串,我们就需要将当前字符串展示到webView上面,所以我们对HTML标签需要有 ...
- 今日 使用ajaxfileupload 异步上传 但是在IE下面 会弹出下载框
本来以为ajaxfileupload.js的问题 后来发现 其实是 后台代码返回来的时候 修改context.Response.ContentType = "text/html"; ...
- 对于程序开发者看书(指实在的书而不是PDF)的好处。(个人看法而已)
书是实在的东西.不同PDF.他能带你进入一种学习态度的环境 书上已经所列了知识点.看了.那些知识点就是你的. 第一次看,未必完全理解到里面的东西.说不定过几天,几周,几个月,甚至几年.再看.就有可能看 ...
- 通过transform属性改变图片的位置大小等信息
对UIImageView的位置大小方向的改变可以通过改变其transform属性值实现. 位置改变: var transform = CGAffineTransformMakeTranslation( ...
- ubuntu系统中的VMware 安装win7 Ghost镜像的几个坑
1.ghost镜像安装时要先分区 2.分区后要激活 3.VM(虚拟机安装win7 提示 :units specified don't exist, SHSUCDX can't install)解决方法 ...