首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何为容器对象实现__iter__(self)

如何为容器对象实现__iter__(self)
EN

Stack Overflow用户
提问于 2010-10-26 08:59:23
回答 6查看 140.4K关注 0票数 135

我已经编写了一个自定义容器对象。

根据this page的说法,我需要在我的对象上实现这个方法:

代码语言:javascript
复制
__iter__(self)

但是,根据Python参考手册中的Iterator Types链接,并没有给出如何实现自己的示例。

是否有人可以发布一个片段(或链接到资源),说明如何做到这一点?

我正在编写的容器是一个映射(即通过唯一键存储值)。可以像这样迭代dicts:

代码语言:javascript
复制
for k, v in mydict.items()

在这种情况下,我需要能够返回两个元素(一个元组?)在迭代程序中。目前还不清楚如何实现这样的迭代器(尽管已经提供了几个友好的答案)。有没有人可以解释一下如何为一个类map的容器对象实现一个迭代器?(例如,行为类似于dict的自定义类)?

EN

回答 6

Stack Overflow用户

发布于 2010-10-26 09:04:01

我通常会使用生成器函数。每次使用you语句时,它都会向序列中添加一项。

下面将创建一个迭代器,该迭代器生成5个项目,然后生成some_list中的每个项目。

代码语言:javascript
复制
def __iter__(self):
   yield 5
   yield from some_list

在3.3之前,yield from还不存在,所以你必须这样做:

代码语言:javascript
复制
def __iter__(self):
   yield 5
   for x in some_list:
      yield x
票数 149
EN

Stack Overflow用户

发布于 2010-10-26 09:13:18

如果你已经定义了next()方法(生成器对象),通常__iter__()只返回self:

下面是一个生成器的虚拟示例:

代码语言:javascript
复制
class Test(object):

    def __init__(self, data):
       self.data = data

    def next(self):
        if not self.data:
           raise StopIteration
        return self.data.pop()

    def __iter__(self):
        return self

但是__iter__()也可以像这样使用:http://mail.python.org/pipermail/tutor/2006-January/044455.html

票数 17
EN

Stack Overflow用户

发布于 2016-11-17 00:16:34

python中的“可迭代接口”由两个方法__next__()__iter__()组成。__next__函数是最重要的,因为它定义了迭代器行为-也就是说,该函数决定接下来应该返回什么值。__iter__()方法用于重置迭代的起始点。通常,当使用__init__()设置起始点时,您会发现__iter__()只返回self。

请参阅下面的代码来定义类反向,它实现了"iterable接口“,并在来自任何序列类的任何实例上定义了一个迭代器。__next__()方法从序列的末尾开始,以与序列相反的顺序返回值。请注意,来自实现“序列接口”的类的实例必须定义一个__len__()和一个__getitem__()方法。

代码语言:javascript
复制
class Reverse:
    """Iterator for looping over a sequence backwards."""
    def __init__(self, seq):
        self.data = seq
        self.index = len(seq)

    def __iter__(self):
        return self

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

>>> rev = Reverse('spam')
>>> next(rev)   # note no need to call iter()
'm'
>>> nums = Reverse(range(1,10))
>>> next(nums)
9
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4019971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档