博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python闭包
阅读量:7032 次
发布时间:2019-06-28

本文共 1905 字,大约阅读时间需要 6 分钟。

hot3.png

一.定义,什么样的叫闭包?

在Python语言中,一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。你在调用函数A的时候传递的参数就是自由变量。简单的说,内部函数可以使用外部函数变量的行为,就叫闭包。

二. 为什么使用闭包?

因为在工作中,闭包可以缩减我们的代码量,可以偷懒,在一些场合还可以降低资源的消耗。闭包的几个特点:

1.与父函数中的变量建立关联,减少文件中全局变量的使用。有利于后面发展的并行运算。

2.即便生成闭包的环境-父函数已经释放,闭包还是会存在即内部变量的值还是存在于内存中。

三.实例说明

1.平常中,有些类的功能可以通过闭包的方式来实现,以达到缩减代码量的目的。

## 类class Food(object):    def __init__(self,food):        self.food=food        #self.name=name    def eat_food(self,name):        print "{}偷吃了{}".format(name,self.food)apple=Food('apple')apple.eat_food('小明')## 闭包方式def Fruit(fruit):    def eat(name):        print '{}偷吃了{}'.format(name,fruit)    return eatman=Fruit('milk')man('小强')

2.装饰器在很多时候就是闭包的一种应用,不过装饰器传递的是函数体。比如下面带参的装饰器Auth():

def Auth(auth_type):    def wrap(func):        def inner(*args,**kwargs):            if auth_type=='local':                name=raw_input('输入用户名:')                passwd=raw_input('输入密码:')                if auth_type=='local':                    if name=='admin' and passwd=='admin':                        print('登陆成功!')                        func(*args,**kwargs)                    else:                        print('登录失败')            if auth_type=='ldap':                print '喔,你改用ldap方式认证啦'                func(*args,**kwargs)        return inner    return wrap@Auth('local')def Tv(price):    print('电视售价:{}'.format(price))@Auth('ldap')def Index():    print('欢迎来到XXX')Tv(3500)Index()

不带参的装饰器f():

def wrap(fun):    def inner(*args,**kwargs):        print 'call function {}():'.format(fun.__name__)        return fun(*args,**kwargs)    return inner@wrapdef tv():    print 'Welcome'tv()##输出call function tv():Welcome

可以看到带有参数的装饰器比没带参数的装饰器多了一层包裹。

3. 在闭包中使用循环变量有个陷阱

161847_wAET_2899810.png

可以看见,结果并未如一些人预料到的1,4,9  。   原因就是闭包内部的inner()是在for循环结束的时候才开始执行的。由此,为了避免一些预料外的错误,应尽量不在闭包中使用循环变量。

当然在特殊情况下的补救措施也是有的-对内部函数再包一层,借用函数的参数来保存每次循环后的变量值:

163555_YoZY_2899810.png

参考资料:

1.http://

2.http://

3.https://

4.http://

转载于:https://my.oschina.net/szwyh2014/blog/840969

你可能感兴趣的文章
iOS-CALayer遮罩效果
查看>>
为什么需要版本管理
查看>>
五、Dart 关键字
查看>>
React Native学习笔记(一)附视频教学
查看>>
记Promise得一些API
查看>>
javascript事件之调整大小(resize)事件
查看>>
20145234黄斐《Java程序设计》第六周学习总结
查看>>
【CLRS】《算法导论》读书笔记(四):栈(Stack)、队列(Queue)和链表(Linked List)...
查看>>
hibernate 和 mybatis区别
查看>>
互联网广告综述之点击率特征工程
查看>>
HDU3421 Max Sum II【序列处理】
查看>>
POJ NOI MATH-7653 地球人口承载力估计
查看>>
iOS UI高级之网络编程(HTTP协议)
查看>>
使用cocoaPods import导入时没有提示的解决办法
查看>>
iOS数据持久化存储之归档NSKeyedArchiver
查看>>
JavaScript面向对象
查看>>
Intellij修改模板代码
查看>>
2.页面布局示例笔记
查看>>
一些老游戏CPU 100%占用的解决方法
查看>>
f5基本介绍
查看>>