>>> reversed(xrange(100))
<rangeiterator object at 0xb72aab78>
>>> it = reversed(xrange(100)).__iter__()
>>> it
<rangeiterator object at 0xb72aa4d0>
>>> next(it)
99
我如何在Python中实现这样的东西?为了更具特色,我怎样才能制作一个迭代器,如果没有它在内存中的列表可以被反转之前可以反转呢?
答案 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。