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
- 通过g.send(None)或者next(g)可以启动生成器函数,并执行到第一个yield语句结束的位置。此时,执行完了yield语句,但是没有给receive赋值。yield value会输出初始值0注意:在启动生成器函数时只能send(None),如果试图输入其它的值都会得到错误提示信息。
- 通过g.send(‘aaa’),会传入aaa,并赋值给receive,然后计算出value的值,并回到while头部,执行yield value语句有停止。此时yield value会输出”got: aaa”,然后挂起。
- 通过g.send(3),会重复第2步,最后输出结果为”got: 3″
- 当我们g.send(‘e’)时,程序会执行break然后推出循环,最后整个函数执行完毕,所以会得到StopIteration异常。
另外还有一个close()函数,使用生成器调用之后就会关闭,继续next就会抛出错误。