Python Generator 生成器

生成器实现了迭代器协议,即生成一个可迭代的对象,可以利用for循环来遍历。

与列表不同,列表一次性生成整个列表,如果该列表非常大,则会非常占内存。

生成器是指在迭代的环境中,每次迭代按需产生一个对象,不会一次性构建整个列表,从而节约了内存空间。

创建生成器的两种办法

生成器表达式

与列表表达式类似,只不过将[]更改为()即可。

list1=[i for i in range(8)]
gene1=(i for i in range(8))
print(list1)
print(gene1)

[0, 1, 2, 3, 4, 5, 6, 7]
<generator object <genexpr> at 0x000001EECD07F748>
生成器函数(yield 关键词)

运行过程:生成器函数返回一个迭代器,for循环等迭代环境对这个迭代器不断调用next函数,不断的运行到下一个yield语句,逐一取得每一个返回值,直到没有yield语句可以运行,最终引发StopIteration异常。

def gen_squares(num):
  for x in range(num):
      yield x ** 2

G = gen_squares(5)
print(G)
print(iter(G))

<generator object gen_squares at 0x0000000002402558>
<generator object gen_squares at 0x0000000002402558>

G = gen_squares(3)
print(G)
print(iter(G))
print(next(G))
print(next(G))
print(next(G))
print(next(G))


<generator object gen_squares at 0x00000000021C2558>
<generator object gen_squares at 0x00000000021C2558>
0
1
4
Traceback (most recent call last):
File "E:/12homework/12homework.py", line 10, in <module>
print(next(G))
StopIteration
生成器函数- yield 运行规则

在每次循环的时候,生成器函数都会在yield处产生一个值,并将其返回给调用者,即for循环。然后在yield处保存内部状态,并挂起中断退出。在下一轮迭代调用时,从yield的地方继续执行,并且沿用上一轮的函数内部变量的状态,直到内部循环过程结束。

def gen_squares(num):
  for x in range(num):
      yield x ** 2
      print('x={}'.format(x))

for i in gen_squares(4):
print('x ** 2={}'.format(i))
print('--------------')

x ** 2=0
--------------
x=0
x ** 2=1
--------------
x=1
x ** 2=4
--------------
x=2
x ** 2=9
--------------
x=3
Categories: Python

1 Comment

Python 文件操作 – xinzipanghuang.home · 2020年7月23日 at 17:17

[…] file.open 函数生成一个迭代器(生成器) […]

Leave a Reply

Your email address will not be published.