问题
当python中的生成器被完整遍历一次后,就无法再次遍历。
generator = (i for i in range(3))
print(type(generator))
# <class 'generator'>
for i in generator:
print(i)
# 0
# 1
# 2
## 生成器被完整遍历了一次
for i in generator:
print(i)
## 生成器已经空了,再次遍历print语句不会被执行
## 因为调用generator.__next__()会抛出StopIteration,被for循环捕获并结束循环
我们希望享有生成器迭代占用内存小的特性,又希望这个生成器能被遍历多次。
方案之一是使用函数itertools.tee
来复制生成器
复制生成器
语法:generator1, generator2 = itertools.tee(generator, n=2)
generator是需要复制的生成器, n是复制出生成器个数,默认为2。
我们为了生成器能多次遍历,可以这样写:
generator, copy_generator = itertools.tee(generator, 2)
然后遍历copy_generator,保存的generator可以再次复制。
import itertools
generator = (i for i in range(3))
for i in range(3):
print('第{}次遍历generator'.format(i+1))
generator, generator2 = itertools.tee(generator)
for j in generator2:
print(j)
# 第1次遍历generator
# 0
# 1
# 2
# 第2次遍历generator
# 0
# 1
# 2
# 第3次遍历generator
# 0
# 1
# 2
注意事项:
1、generator被复制后尽量不要使用
import itertools
generator = (i for i in range(3))
generator1, generator2 = itertools.tee(generator)
print('iter generator')
for i in generator:
print(i)
print('iter generator1')
# 遍历父生成器后再遍历子生成器
for i in generator1:
print(i)
# iter generator
# 0
# 1
# 2
# iter generator1
## 父生成器被遍历为空后,子生成器也会变成空的
2、如果生成器中迭代的还是生成器,复制最外层生成器,生成器依然只能遍历一次。
import itertools
generator = ((i+j for i in range(2)) for j in range(2))
generator1, generator2 = itertools.tee(generator)
print('iter generator1')
for i in generator1:
print(type(i))
for j in i:
print(j)
print('iter generator2')
for i in generator2:
for j in i:
print(j)
# iter generator1
# <class 'generator'>
# 0
# 1
# <class 'generator'>
# 1
# 2
# iter generator2
## 遍历generator2没有输出,说明itertools.tee只是浅复制
网友评论