首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >python迭代器与生成器

python迭代器与生成器

作者头像
编程黑洞
发布2023-03-06 18:57:52
发布2023-03-06 18:57:52
3460
举报
文章被收录于专栏:编程黑洞编程黑洞

# 迭代器和可迭代对象

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

实现了__iter____next__的是迭代器.

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

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

# 如何实现迭代器?

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

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

代码语言:javascript
复制
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异常。

例子:

代码语言:javascript
复制
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()

# 生成器表达式创建生成器

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

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

代码语言:javascript
复制
[i for i in range(10)]

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

代码语言:javascript
复制
(i for i in range(10))

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

例子:

代码语言:javascript
复制
class A:
    def __iter__(self):
        return (x*3 for x in range(10))
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # 迭代器和可迭代对象
  • # 如何实现迭代器?
  • # 生成器和生成器函数
    • # 生成器函数创建生成器
    • # 生成器表达式创建生成器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档