如何在Python中实现测距仪?

时间:2012-03-22 09:45:42

标签: python iterator

>>> reversed(xrange(100))
<rangeiterator object at 0xb72aab78>
>>> it = reversed(xrange(100)).__iter__()
>>> it
<rangeiterator object at 0xb72aa4d0>
>>> next(it)
99

我如何在Python中实现这样的东西?为了更具特色,我怎样才能制作一个迭代器,如果没有它在内存中的列表可以被反转之前可以反转呢?

3 个答案:

答案 0 :(得分:3)

基本上,您在集合上实现__reversed__ magic method

xrange的逻辑如下:

def __reversed__(self):
    return iter(xrange(stop - 1, start - 1, step * -1))

没有技巧 - 您需要知道如何生成反向迭代器。 Python不适合你。

答案 1 :(得分:1)

如果你的迭代器实现了方法__reversed__(),那么内置reversed()将使用它。 xrange()返回执行此操作的迭代器。

答案 2 :(得分:0)

reversed将适用于两种类型的对象:

  • 一个序列(例如list
  • 使用__reversed__魔法
  • 的迭代器

如果您有自定义序列,并且可以使用该序列的len(),那么您就可以了 - 否则,您需要添加__len__魔术方法;如果你不能(例如因为长度不知道),那么你就不能懒得逆转它。

如果你有一个自定义迭代器,那么确保它具有__reversed__魔术方法:__reversed__必须返回一个倒退的新迭代器;再次,如果你不能提供一个(例如因为长度未知),那么你就不能懒得逆转它。

注意:有关创建自定义迭代的详细信息,请参阅this answer