最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • Python3生成器

    通过列表推导式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的。
    假如创建一个包含上百万个成员的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,
    那后面绝大多数元素占用的空间都白白浪费了。

    如果我们可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的 list,从而节省大量的空间,在
    Python 中,这种一边循环一边计算的机制,称为生成器(Generator)。

    生成器定义和使用

    要创建一个生成器,有很多种方法,最简单的方式是:只要把一个列表推导式的
    [] 改成 (),就创建了一个生成器。

    myge = (item for item in range(10))
    print(type(myge))

    我们可以直接输出集合的每一个元素,但我们怎么输出生成器的每一个元素呢,
    如果要一个一个输出元素,可以通过生成器的 __next__ 函数或者
    Python 内置的 next 函数(实际上该函数间接调用生成器的 __next__ 函数)。

    myge = (item for item in range(3))
    print(myge.__next__())
    print(myge.__next__())
    print(myge.__next__())
    
    # 等价于上面代码
    myge = (item for item in range(3))
    print(next(myge))
    print(next(myge))
    print(next(myge))

    生成器保存的是算法,每次调用 __next__ 函数
    就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的错误。

    myge = (item for item in range(3))
    print(myge.__next__())
    print(myge.__next__())
    print(myge.__next__())
    print(myge.__next__())  # 抛出异常

    用生成器的 __next__ 方法太单一不灵活,我们可以使用 for 循环,因为生成器也是可迭代对象。

    from collections.abc import Iterable
    
    myge = (item for item in range(3))
    print(isinstance(myge, Iterable))
    
    for item in myge:
        print(item)

    注意事项:我们基本上永远不会调用 next 函数,而是通过 for 循环来迭代它,因为 for 循环在遍历生成器时,
    计算到最后一个元素就会自动停止遍历,不会抛出 StopIteration 的错误,这样很友好。

    让函数变成生成器

    生成器非常强大,如果推算的算法比较复杂,用类似列表推导式的 for 循环无法实现的时候,还可以用函数来实现,
    我们先来看一个简单的例子,写一个可以生成无限偶数的生成器。

    def ge_even():
        data = 1
        while True:
            if data % 2 == 0:
                yield data
            data += 1
    
    even = ge_even()
    print(type(even))  # even 是个生成器
    
    for item in even:
        print(item)

    只要函数定义中包含 yield 关键字,那么这个函数就不再是一个普通函数,而是一个生成器,该生成器和其它生成器具有一样的性质,
    比如可以用他的 __next__ 函数,可以用 for 循环遍历。

    def ge_func():
        yield 1
        yield 2
        yield 3
    
    myge = ge_func()
    print(myge.__next__())
    print(myge.__next__())
    print(myge.__next__())
    
    myge = ge_func()
    for item in myge:
        print(item)

    本节重要知识点

    生成器和推导式的区别。

    遍历生成器的方法。

    如何把函数变成生成器。

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » Python3生成器
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 293稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情