- 关键字
generator yield StopIteration Iterable - 定义
生成器:generator
之前学习了列表生成式,作用是生成一个列表,列表是元素的集合,集合创建完成,要占用一定空间,我们是否可以使用一个生成一个,这个就是生成器。 - 创建方式一
第一种方法很简单,只要把一个列表生成式的 [] 改成 (),就创建了一个 generator
>>> L = [x*x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x*x for x in range(10))
>>> g
<generator object <genexpr> at 0x000000000059EF68>
说明:
列表生成式,是根据算法,将全部元素生成出来,放到列表中,而生成器,是保存算法,在每次调用的时候,计算出下一个元素。直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的错误。
- 创建方式二
如果一个函数定义中包含 yield 关键字,那么这个函数就不再是一个普通函数,而是一个 generator
>>> def fib(max):
... n, a, b = 0, 0, 1
... while n < max:
... yield b
... a,b =b, a +b
... n = n + 1
... return 'done'
...
>>> f = fib(6)
>>> f
<generator object fib at 0x000000000059EF68>
>>> for n in f:
... print(n)
...
1
1
2
3
5
8
- 获取 generator 元素方式
- 通过 next() 函数获得 generator 的下一个值(一般不用)
>>> next(g)
0
>>> next(g)
1
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
- 使用 for 循环来迭代它
>>> g = (x*x for x in range(10))
>>> for n in g:
... print(n)
...
0
1
4
9
16
25
36
49
64
81
>>> for n in g:
... print(n)
...
>>> g
<generator object <genexpr> at 0x000000000059EFC0>
>>> for n in g:
... print(n)
...