使数据结构在python中可迭代

时间:2010-07-13 19:21:16

标签: python loops iterator for-loop

所以我已经完成了一些在线阅读和文档,但我很难找到如何做到这一点。我正致力于创造一款冒险游戏。我有一个关卡课程(包含一堆房间)和一个Room课程。我希望能够做到以下几点。

l = Level()
for room in l:
    #following code here

这对我来说似乎很简单,但是我找不到实现自定义迭代器的正确过程。这可能是一个简单的答案,但我在网上找不到它。非常感谢任何帮助!

4 个答案:

答案 0 :(得分:3)

__iter__与迭代器生成器一起使用。 E.g。

def __iter__(self):
  for r in rooms:
    yield r

迭代器生成器基本上是用于实现迭代器的伪方法。请注意,不要求生成器使用for循环。它可以根据需要使用任何构造组合(if,for,while等)。基本上,您只需记住调用者将按照您“调用”yield的顺序获取元素,并且迭代将在方法执行时结束。

请参阅Python教程的this section

答案 1 :(得分:3)

如果定义名为__iter__(self)的成员方法,Python将知道如何迭代它。

在这种方法中,我建议你使用yield来返回你的数据(这叫做生成器)。您还可以返回列表或元组,但这在内存方面更有效。这是一个例子:

class Test(object):
    def __iter__(self):
        for x in range(10): 
            yield x

l = Test()
for room in l:
    print room

答案 2 :(得分:1)

作为编写生成器的替代方法,__iter__方法只需返回迭代器 - 如果您的Level对象具有保存房间的内部数据结构,那么您可以直接返回它的迭代器: / p>

class Level(object):
    def __init__(self):
        self.rooms = []

    def __iter__(self):
        return iter(self.rooms)

如果房间容器是字典,例如将房间名称映射到Room对象,然后您可以使用dict.itervalues方法获取Room对象的迭代器:

class Level(object):
    def __init__(self):
        self.rooms = {}

    def __iter__(self):
        return self.rooms.itervalues()

答案 3 :(得分:-1)

为什么不使用发电机。

>>> import timeit
>>> class Test:
    def __iter__(self):
        for i in range(10):
            yield i

>>> t1 = lambda: [k for k in Test()]
>>> timeit.timeit(t1)
3.529460948082189


>>> def test2():
    for i in range(10):
        yield i

>>> t2 = lambda: [k for k in test2()]
>>> timeit.timeit(t2)
3.171831107365392