我已经编写了一个自定义容器对象。
根据this page的说法,我需要在我的对象上实现这个方法:
__iter__(self)
但是,根据Python参考手册中的Iterator Types链接,并没有给出如何实现自己的示例。
是否有人可以发布一个片段(或链接到资源),说明如何做到这一点?
我正在编写的容器是一个映射(即通过唯一键存储值)。可以像这样迭代dicts:
for k, v in mydict.items()
在这种情况下,我需要能够返回两个元素(一个元组?)在迭代程序中。目前还不清楚如何实现这样的迭代器(尽管已经提供了几个友好的答案)。有没有人可以解释一下如何为一个类map的容器对象实现一个迭代器?(例如,行为类似于dict的自定义类)?
发布于 2010-10-26 09:04:01
我通常会使用生成器函数。每次使用you语句时,它都会向序列中添加一项。
下面将创建一个迭代器,该迭代器生成5个项目,然后生成some_list中的每个项目。
def __iter__(self):
yield 5
yield from some_list
在3.3之前,yield from
还不存在,所以你必须这样做:
def __iter__(self):
yield 5
for x in some_list:
yield x
发布于 2010-10-26 09:13:18
如果你已经定义了next()方法(生成器对象),通常__iter__()
只返回self:
下面是一个生成器的虚拟示例:
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
发布于 2016-11-17 00:16:34
python中的“可迭代接口”由两个方法__next__()
和__iter__()
组成。__next__
函数是最重要的,因为它定义了迭代器行为-也就是说,该函数决定接下来应该返回什么值。__iter__()
方法用于重置迭代的起始点。通常,当使用__init__()
设置起始点时,您会发现__iter__()
只返回self。
请参阅下面的代码来定义类反向,它实现了"iterable接口“,并在来自任何序列类的任何实例上定义了一个迭代器。__next__()
方法从序列的末尾开始,以与序列相反的顺序返回值。请注意,来自实现“序列接口”的类的实例必须定义一个__len__()
和一个__getitem__()
方法。
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
https://stackoverflow.com/questions/4019971
复制相似问题