Contents
python 闭包和生成器的一点说明
主要是我在看python闭包和生成器的时候,有些以前没接触过的和经常会犯错的,感觉记一下可以偶尔回顾下。
- python的闭包中不能改变外部变量(指的是不能改变外部变量的引用),但是如果外部变量是个可变类型(比如list)是可以修改它的具体内容的,有点类似我们传统概念里的“传引用”;而且重要的是,即使变量在外部不在引用了,也不会被回收,所以闭包应用中内存泄露的问题也是需要多考虑的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!/usr/bin/env python # -*- coding:utf-8 -*- params = [1,2,3] params2 = [3,4,5,6] def outer(): def inner(): params.append(4) params2 = [5,6,7,8] return inner def closure_test(): print params,params2 outer()() print params,params2 closure_test() |
- 生成器并不单单有个yield,还有一个send函数可以和generator进行交互,产生一种用户态控制的异步效果,也就是python中协程的基础。调用生成器的send方法发送的对象,在生成器内部可以使用yield接收。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #!/usr/bin/env python # -*- coding:utf-8 -*- import time import random def call_other_rest_service(): rest_result = 0 rest_endpoint = '' while True: rest_endpoint = yield '%s---%d' % (rest_endpoint, rest_result) rest_result = random.randint(3,6) time.sleep(rest_result) # 模拟调用一个很慢的restful服务 c = call_other_rest_service() next(c) result = c.send('http://xxxx.com/test.do') print 'send request to xxxx', result result = c.send('http://yyyy.com/test.do') print 'send request to yyyy', result |