python中迭代器和生成器的理解

迭代器

区分iterable和iterator两个概念:

可迭代对象 iterable:
可迭代的对象的意思是就是说这个实体是可迭代的,例如字符、列表、元组、字典、迭代器等等,可以用for … in进行循环,可以使用for循环迭代的标志是内部实现了__iter__方法。

迭代器 iterator:
iterator必定是iterable的,因此其必然含有__iter__方法,此方法保证了iterator是可以迭代的。与iterable相比iterator多了一个next()方法,next()方法用于定制for循环时具体的返回值及返回顺序以及处理StopIteration异常等。

例子中Counter是迭代器 iterator,直接使用for循环时,隐藏了__iter__和__next__的细节。

    for i in c:
        print(i, end='')

而下面的代码展示了迭代器中__iter__和__next__的细节

    iterater = iter(c)
    while True:
        try:
            x = iterater.__next__()
            print(x, end=' ')
        except StopIteration as e:
            break

完整例子

class Counter(object):
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        return self

    def __next__(self):
        # 返回下一个值直到当前值大于 high
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1


if __name__ == '__main__':
    c = Counter(5, 10)

    # for i in c:
    #     print(i, end='')

    iterater = iter(c)
    while True:
        try:
            x = iterater.__next__()
            print(x, end=' ')
        except StopIteration as e:
            break
        

生成器

generator对象是一种特殊的iterator函数。‘generators provide a convenient way to implement the iterator protocol.’

生成器会在执行过程中保存执行的上下文环境,并在下次循环中从yield语句后继续执行。这解释了生成器节约内存,适用于大数据处理。

生成器的创建办法有两种:
通过函数创建,称作generator function
通过列表推导式创建,称作generator expression

generator function
通过函数创建的标志是yield关键字,yield的效果可以“看作”return。
同样的例子使用generator function

def counter_generator(low, high):
    while low <= high:
        yield low
        low += 1

if __name__ == '__main__':
    for i in counter_generator(5,10):
        print(i, end=' ')

generator expression
生成器表达式是列表推导式和生成器的一个高性能,内存使用效率高的推广。

列表推导式

sum([x*x for x in range(1,10)])

生成器表达式

sum(x*x for x in range(1,10))
g = (x*x for x in range(1,10))

其中g是生成器表达式

注1

无法创建一个可重复使用的生成器,但可以创建一个对象,将它的 iter 方法调用得到一个生成器。

class Counter(object):
    def __init__(self, low, high):
        self.low = low
        self.high = high
    def __iter__(self):
        counter = self.low
        while self.high >= counter:
            yield counter
            counter += 1

gobj = Counter(5, 10)
for num in gobj:
    print(num, end=' ')

上面的 gobj 并不是生成器或迭代器,因为它不具有 next 方法,只是一个可迭代对象,生成器是一定不能重复循环的。而 gobj.iter() 是一个生成器,因为它是一个带有 yield 关键字的函数。

Reference:
Python迭代器,生成器(iterator,generator)详解
完全理解Python迭代对象、迭代器、生成器

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值