[Python]浅探生成器Generator

本文浅探Python的生成器Generator,它是一个类,具备方法和方法。通过生成器可以节省内存,例如generator表达式和generator function。使用时,通过next()或for循环按需获取数据,防止一次性生成大量数据导致的内存压力。文章列举了三个基本的应用实例,详细阐述了Generator的使用方法和优势。
摘要由CSDN通过智能技术生成

是一个类

类中同时包含有__iter__()方法和__next__()方法的都是生成器。

获得方法

常见的有几种
eg.1 生成器generator

lst = [1,2,3,4]
generator = (x for x in lst)

注意这里括号不是’[]’,否则生成将是一个数组。
相比于用’[]’生成的数组,这里仅生成了generator,而数据则在需要的时候才生成,这在数据量较大时有明显的内存消耗优势。

eg.2 生成器方法generator function

lst = [1,2,3,4]
def GetGenerator():
    for t in lst:
        yield t
generator = GetGenerator()

凡是包含yield的方法都是generator function,这个方法调用后的返回值是一个generator。

使用方法

生成器的理念在于按需获取,从而避免将数据一次性生成。可以通过next(generator)或者generator.__next__()来获取生成的数据,需要注意的是获取数据时如果超过了生成器拥有的数据量,将会抛出一个StopIteration的异常。

三个基本应用实例

# 生成器
class Example(object):
    def __init__(self):
        self.m_lst = [
            (1, '张三'),
            (2, '李四'),
            (3, '王五'),
            (4, '赵六'),
        ]

    def Apply_GetTupleGenerator(self):
        for t in self.m_lst:
            yield t

    def Apply_Traversing(self):
        generator = (t for t in self.m_lst)
        for t in generator:
            print(t)

    def Apply_Enum(self, nBegin = 0):
        def _enum():
            nIdx = nBegin
            while(True):
                yield nIdx
                nIdx += 1
        return _enum().__next__

if __name__ == "__main__":
    example = Example()
    # 应用一:生成器的基本使用
    generator = example.Apply_GetTupleGenerator()
    print(next(generator)) # (1, '张三')
    print(next(generator)) # (2, '李四')
    print(next(generator)) # (3, '王五')
    print(next(generator)) # (4, '赵六')
    # 应用二:遍历
    example.Apply_Traversing() # 输出同上面四句
    # 应用三:枚举
    enum = example.Apply_Enum()
    print(enum()) # 0
    print(enum()) # 1
    print(enum()) # 2
    print(enum()) # 3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值