这些东西是我在慕课网,廖雪峰大神的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]闭包到底是什么鬼?的更多相关文章

  1. Python 闭包小记

    闭包就是能够读取其他函数内部变量的函数.例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“.在本质上,闭包是将函数内部和函数外部连接起来 ...

  2. 理解Python闭包概念

    闭包并不只是一个python中的概念,在函数式编程语言中应用较为广泛.理解python中的闭包一方面是能够正确的使用闭包,另一方面可以好好体会和思考闭包的设计思想. 1.概念介绍 首先看一下维基上对闭 ...

  3. 学Python后到底能干什么?

    Python是一种什么语言? Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的Jav ...

  4. Python 闭包

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

  5. JavaScript的“闭包”到底是什么

    在JavaScripot函数闭包的定义中,一般都有一个outer 函数,一个inner函数.那么“闭包”到底是指outer函数呢,还是指inner函数? 从官方定义来看,并不清楚:A closure  ...

  6. Python闭包与函数对象

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

  7. Python闭包及装饰器

    Python闭包 先看一个例子: def outer(x): def inner(y): return x+y return innder add = outer(8) print add(6) 我们 ...

  8. Python闭包详解

    Python闭包详解 1 快速预览 以下是一段简单的闭包代码示例: def foo(): m=3 n=5 def bar(): a=4 return m+n+a return bar >> ...

  9. Python闭包及其作用域

    Python闭包及其作用域 关于Python作用域的知识在python作用域有相应的笔记,这个笔记是关于Python闭包及其作用域的详细的笔记 如果在一个内部函数里,对一个外部作用域(但不是全局作用域 ...

随机推荐

  1. SVN仓库删除最近的提交,还原到某日期以前的版本(svn仓库 删除最近几次更改)

    由于某日删除了SVN仓库的大量内容,现在突然想恢复,又要保留LOG的连贯性(恢复出来的已删除文件,会是新增,没有之前的历史Log了),所以才有了这需求. Dump版本库的版本(457以后版本不要) - ...

  2. 无锁编程以及CAS

    无锁编程 / lock-free / 非阻塞同步 无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Sy ...

  3. iOS 渐变提示。Labe自动换行

    UILabel *noticeLabel = [[UILabel alloc]init]; noticeLabel.text = @"当前账号已失效果,已清除当前账号已失效果,已清除当前账号 ...

  4. HTML5手机APP开发入门(2)

    HTML5手机APP开发入门(2) 课程内容 使用IonicFramework v2 + angular 2 完成一个简单的联系人列表的操作,有三个页面: ListPage,DetailPage,Ad ...

  5. Xcode中iPhone iPad模拟器调整大小的方法

    Xcode中调试iPad程序默认的iPad模拟器非常小,如何方法iPad模拟器的显示尺寸呢? 选中iOS模拟器,在“Window -> 缩放比例”中就可以调整了. 快捷键: Command + ...

  6. Scrum介绍

    Scrum介绍 摘要 如今,项目管理的步伐越来越快.项目管理需要更灵活.更积极地,向应客户的需求.使用敏捷项目管理方法,项目经理可以在不影响价值.质量和商业规则的前提下实现所有目标,Scrum是一种迭 ...

  7. DataGridView隔行显示不同的颜色

      如果该dataGridView是跟数据库绑定的,则可以触发DataBindingComplete事件:  1private   void   dataGridView1_DataBindingCo ...

  8. Hbase&Hadoop常用命令

    Hbase中根据Rowkey的前缀Prefix查询数据: scan 'test_xiaomifeng_monitoring_log',{FILTER => "(PrefixFilter ...

  9. 如何利用OCS缓存TomcatSession全局变量(转)

    转: 首先非常感谢阿里云给我们提供了一个如此省事的平台. 我们公司是一家物流公司,主要提供运输和仓储的服务.我们现在正在把我们的系统往阿里云迁移.当然,还在迁移过程中,所以还有很多是没办法现在说得太清 ...

  10. IE6下的效果

    1. IE6有宽度border实现透明 如果想使得边框颜色透明,在其余浏览器下比较简单,直接使用:border-color:transparent;但在IE6下这个办法不行,可以通过下面的方式实现: ...