在Python中使数据结构可迭代

1 投票
4 回答
2952 浏览
提问于 2025-04-16 01:14

我在网上和文档里查了一些资料,但还是找不到怎么做。我正在创建一个冒险游戏。我有一个关卡类(里面包含很多房间)和一个房间类。我想要实现类似下面的功能。

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

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

4 个回答

1

作为写生成器的另一种选择,__iter__ 方法只需要返回一个迭代器。如果你的 Level 对象内部有一个数据结构来存放房间,那么你可以直接返回它的迭代器:

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

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

如果房间的容器是一个字典,比如说把房间名称映射到房间对象,那么你可以使用 dict.itervalues 方法来获取房间对象的迭代器:

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

    def __iter__(self):
        return self.rooms.itervalues()
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
3

使用 __iter__ 和一个迭代器生成器。比如:

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

迭代器生成器其实就是一个伪方法,用来实现一个迭代器。需要注意的是,生成器并不一定要使用 for 循环。它可以根据需要使用任何组合的结构(比如 if、for、while 等等)。简单来说,你只需要记住,调用者会按照你“调用” yield 的顺序获取元素,当这个方法结束时,迭代也就结束了。

可以查看 Python 教程的这一部分

撰写回答