[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闭包及其作用域的详细的笔记 如果在一个内部函数里,对一个外部作用域(但不是全局作用域 ...
随机推荐
- RMAN duplciate 准备时,需要检查的target数据库参数内容
SQL> show parameter audit_file_dest; NAME TYPE VALUE------ ...
- 原创内容搬家到csdn博客啦~
以后原创的文章就发布在csdn博客啦: http://blog.csdn.net/aceyan0718 这里就用来当作一个网络笔记本吧,转载些优质的内容
- iOS 渐变提示。Labe自动换行
UILabel *noticeLabel = [[UILabel alloc]init]; noticeLabel.text = @"当前账号已失效果,已清除当前账号已失效果,已清除当前账号 ...
- PS脚本获取网络适配器状态
1. Get-WmiObject -Class Win32_NetworkAdapterConfiguration ` -filter "IPEnabled = $true" 2. ...
- Think in java 4th读书笔记__last update20151130
一周至少两章,去掉最后的并发和图形化用户界面,刚好需要2个半月才能学好.这进度感觉有点慢,所以做下调整吧,改成一个月会不会更好点^^,认认真真的把java的圣经给看一遍. 计划: 第1~6 11.17 ...
- JSP中文乱码解决方案
学习JSP的过程中总会碰到中文乱码问题,有的是post方式提交没问题,用get方式提交有乱码,还有的是部署到tomcat中没问题,在Eclipse中启动tomcat,发现用get方式提交有乱码.产生乱 ...
- redhat下mysql安装与使用
1.安装 (1)查看是否安装 yum list installed mysql* (2)查看现有安装包 yum list mysql* (3)安装mysql服务器端 yum install mysql ...
- html5网页动画总结--jQuery旋转插件jqueryrotate
CSS3 提供了多种变形效果,比如矩阵变形.位移.缩放.旋转和倾斜等等,让页面更加生动活泼有趣,不再一动不动.然后 IE10 以下版本的浏览器不支持 CSS3 变形,虽然 IE 有私有属性滤镜(fil ...
- 【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化
Direct3D初始化大概分为4个步骤: 1.获取接口IDirect3D9的指针.(Direct3DCreate9函数调用). 该接口用户获取系统中物理硬件设备的信息并创建接口IDirect3DDev ...
- Phantomjs 一些简单实用
Phantomjs是一个基于webkit的服务器端JavaScirpt API.它全面支持web而不需要浏览器支持,并且原生支持web的各种标准:DOM处理,CSS选择器,JSON,Canvas和SV ...