[英]How is a rangeiterator implemented in Python?
>>> reversed(xrange(100))
<rangeiterator object at 0xb72aab78>
>>> it = reversed(xrange(100)).__iter__()
>>> it
<rangeiterator object at 0xb72aa4d0>
>>> next(it)
99
我怎样才能在Python中实现这样的东西? 为了更具特色,我怎样才能制作一个迭代器,如果没有它在内存中的列表被反转之前可以颠倒呢?
基本上,您在集合上实现__reversed__
magic方法 。
xrange
的逻辑如下:
def __reversed__(self):
return iter(xrange(stop - 1, start - 1, step * -1))
没有技巧 - 您需要知道如何生成反向迭代器。 Python不会为你做这件事。
如果你的迭代器实现的方法__reversed__()
这将通过内建的使用reversed()
xrange()
返回执行该操作的迭代器。
reversed
将适用于两种类型的对象:
list
) __reversed__
魔术方法的迭代器 如果你有一个自定义序列,并且你可以使用该序列的len()
,你就可以了 - 否则,你需要添加__len__
魔术方法; 如果你不能(例如,因为长度不知道),那么你不能懒洋洋地扭转它。
如果你有一个自定义迭代器,那么确保它有__reversed__
魔术方法: __reversed__
必须返回一个倒退的新迭代器; 再次,如果你不能提供一个(例如因为长度未知),那么你不能懒洋洋地逆转它。
注意 :有关创建自定义迭代的更多信息,请参阅此答案 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.