欢迎光临
我们一直在努力

python 闭包和生成器的一点说明

python 闭包和生成器的一点说明

主要是我在看python闭包和生成器的时候,有些以前没接触过的和经常会犯错的,感觉记一下可以偶尔回顾下。

  1. 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
【本站文章皆为原创,未经允许不得转载】:汤不热吧 » python 闭包和生成器的一点说明
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址