python 闭包和生成器的一点说明
主要是我在看python闭包和生成器的时候,有些以前没接触过的和经常会犯错的,感觉记一下可以偶尔回顾下。
- python的闭包中不能改变外部变量(指的是不能改变外部变量的引用),但是如果外部变量是个可变类型(比如list)是可以修改它的具体内容的,有点类似我们传统概念里的“传引用”;而且重要的是,即使变量在外部不在引用了,也不会被回收,所以闭包应用中内存泄露的问题也是需要多考虑的。
[cc lang=”python”]
#!/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()
[/cc]
- 生成器并不单单有个yield,还有一个send函数可以和generator进行交互,产生一种用户态控制的异步效果,也就是python中协程的基础。调用生成器的send方法发送的对象,在生成器内部可以使用yield接收。
[cc lang=”python”]
#!/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
[/cc]
汤不热吧