Skip to content

Latest commit

 

History

History
80 lines (80 loc) · 1.83 KB

生成器_20170713.md

File metadata and controls

80 lines (80 loc) · 1.83 KB
  • 关键字
    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 元素方式
  1. 通过 next() 函数获得 generator 的下一个值(一般不用)
>>> next(g)
0
>>> next(g)
1
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
  1. 使用 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)
...