美文网首页
python生成器多次遍历(一)------复制生成器

python生成器多次遍历(一)------复制生成器

作者: PinoyCao | 来源:发表于2020-03-15 12:25 被阅读0次

问题

当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只是浅复制

下一篇
python生成器多次遍历(二)------创建生成器类

相关文章

网友评论

      本文标题:python生成器多次遍历(一)------复制生成器

      本文链接:https://www.haomeiwen.com/subject/ooaqehtx.html