python中有两种方式产生生成器:
- 生成器函数:
- 和普通函数看起来差不多,区别是,生成器函数使用yield返回值,而不是用return
- 自动实现了迭代器协议,即实现了__next__方法(python3)
- 生成器函数返回一个生成器对象
- yield返回值之后函数没有结束,而是处于中断状态,下次调用直接从上次的状态继续执行,直到产生StopIteration
例子如下:
#使用迭代方法写的斐波那契函数
In [10]: def fib(n):
...: if n <= 2:
...: yield 1
...: nPre = 1
...: nPost = 1
...: for i in range(n):
...: nCur = nPre + nPost
...: yield nCur
...: nPre, nPost = nPost, nCur
...:
In [11]: type(fib(10))
Out[11]: generator
In [13]: for i in fib(10):
...: print(i)
...:
2
3
5
8
13
21
34
55
89
144
2. 生成器表达式:
和列表推导式类似,区别是将 [ ] 换成了 ( )
例子如下:
In [15]: squares = (i**2 for i in range(10))
In [17]: next(squares)
Out[17]: 0
In [18]: next(squares)
Out[18]: 1
In [19]: next(squares)
Out[19]: 4
In [20]: next(squares)
Out[20]: 9
In [21]: for i in squares:
...: print(i)
...:
16
25
36
49
64
81
最后:生成器只能遍历一次,生成器是一种特殊的迭代器