生成器的机制:边读取边生成数据

如何产生生成器?看如下示例:

g = (x * 3 for x in range(0, 11))print(type(g))

执行结果:

<class 'generator'>

可以看到,g的类型是generator,也就是生成器的意思。

那么生成器如果产生数据呢?接着上面的例子来看:

g = (x * 3 for x in range(0, 11))print(type(g))print(g.__next__())
print(g.__next__())

执行如下:

<class 'generator'>03

我们可以看到,每执行一次g.__next__()就会让生成器产生一个数据(该数据是 for x in range(0, 11)产生的数据 * 3)
当产生数据的次数超过了界限会怎样呢?

g = (x * 3 for x in range(0, 11))print(type(g))print(g.__next__())print(g.__next__())print(g.__next__())print(g.__next__())print(g.__next__())print(g.__next__())print(g.__next__())print(g.__next__())print(g.__next__())print(g.__next__())print(g.__next__())print(g.__next__())

执行结果:

<class 'generator'>03
6
9
12
15
18
21
24
27
30Traceback (most recent call last):
  File "E:/practicemore/ddd.py", line 15, in print(g.__next__())
StopIteration

我们可以看到,报错了,抛出了StopIteration 异常。

拓展:除了使用__next__(),还可以使用next()方法,将生成器对象传入即可