所以我已经完成了一些在线阅读和文档,但我很难找到如何做到这一点。我正致力于创造一款冒险游戏。我有一个关卡课程(包含一堆房间)和一个Room课程。我希望能够做到以下几点。
l = Level()
for room in l:
#following code here
这对我来说似乎很简单,但是我找不到实现自定义迭代器的正确过程。这可能是一个简单的答案,但我在网上找不到它。非常感谢任何帮助!
答案 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