美文网首页
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