4.生成器

1 def sub_generator():
2     yield 1
3     yield 2
4     for i in range(3,10) : yield i
5 
6 a = sub_generator()
7 print(next(a))
8 
9 <<<1

上述代码就是一个经典的生成器,也就是函数里边加入了yield。(在python2中 是a.next(),而在3中,则是next(a)这种调用方法。)

注意生成器里边是不会return回值的,如果你写了return只会是输出到边界时候出现的错误会返回你要return的值。

还有一个需要注意的是send函数。

 1 def gen():
 2     value=0
 3     while True:
 4         receive=yield value
 5         if receive=='e':
 6             break
 7         value = 'got: %s' % receive
 8  
 9 g=gen()
10 print(g.send(None))     
11 print(g.send('aaa'))
12 print(g.send(3))
13 print(g.send('e'))
14 
15 输出为:
16 0
17 got: aaa
18 got: 3
19 Traceback (most recent call last):
20 File "h.py", line 14, in <module>
21   print(g.send('e'))
22 StopIteration
  1. 通过g.send(None)或者next(g)可以启动生成器函数,并执行到第一个yield语句结束的位置。此时,执行完了yield语句,但是没有给receive赋值。yield value会输出初始值0注意:在启动生成器函数时只能send(None),如果试图输入其它的值都会得到错误提示信息。
  2. 通过g.send(‘aaa’),会传入aaa,并赋值给receive,然后计算出value的值,并回到while头部,执行yield value语句有停止。此时yield value会输出”got: aaa”,然后挂起。
  3. 通过g.send(3),会重复第2步,最后输出结果为”got: 3″
  4. 当我们g.send(‘e’)时,程序会执行break然后推出循环,最后整个函数执行完毕,所以会得到StopIteration异常。

另外还有一个close()函数,使用生成器调用之后就会关闭,继续next就会抛出错误。

原文地址:https://www.cnblogs.com/lixiaofou/p/7814606.html