python 迭代器和生成器

迭代器与生成器

迭代器和可迭代对象

实现了__iter__的对象是可迭代对象.

实现了__iter____next__的是迭代器.

两者之间的关系: Python从可迭代的对象中获取迭代器

可迭代对象的抽象基类是abc.Iterable
迭代器的抽象基类是abc.Iterator

在这里插入图片描述

如何实现迭代器?

定义__iter__方法返回带有__next__方法的对象,__iter__可以简单的返回self.

当没有数据返回时,会抛出StopIteration异常停止返回数据。


class MyIter():
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        
        self.index = self.index - 1
        return self.data[self.index]

my_iter = MyIter()
iter(my_iter)   # 返回一个迭代器

生成器和生成器函数

函数中有yield关键字的,就是生成器函数

生成器函数创建生成器

下面的__iter__是一个生成器函数,通过该生成器函数创建生成器对象,包装生成器函数的定义。把生成器传给next(...)函数时,生成器函数会向前,执行函数定义体中的下一个yield语句,返回产出的值,并在函数定义体的当前位置暂停。当无数据返回时,生成器对象会抛出StopIteration异常。

在这里插入图片描述

例子:


import re
import reprlib

RE_WORD = re.compile("\w+")

class Sentence:
    def __init__(self, text):
        self.text = text
        
    def __iter__(self):
        for match in RE_WORD.finditer(self.text):
            yield matc.group()
生成器表达式创建生成器

生成器表达式可以理解为列表推导的惰性版本: 不会迫切地构建列表,而是返回一个生成器,按需惰性生成元素。

列表表达式。 会马上加载所有的元素到内存中

[i for i in range(10)]

生成器表达式: 会得到一个生成器对象,可以通过next或者循环的方式惰性求值。

(i for i in range(10))

虽然下面的__iter__没有yield关键字,但是却有具有生成器表达式,所以__iter__得到的也是一个生成器对象

例子:

class A:
    def __iter__(self):
        return (x*3 for x in range(10))

欢迎关注,互相学习,共同进步~

我的个人博客

我的微信公众号:编程黑洞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值