如何在Python中实现rangeiterator? 反向(X范围(100)) >>>它=反向(xrange(100))。\uuuu iter\uuuuuuuu() >>>它 >>>下一个(it) 99

如何在Python中实现rangeiterator? 反向(X范围(100)) >>>它=反向(xrange(100))。\uuuu iter\uuuuuuuu() >>>它 >>>下一个(it) 99,python,iterator,Python,Iterator,如何在Python中实现类似的东西?更具体地说,我如何制作一个迭代器,它可以被反转,而不必在反转之前在内存中列出它?基本上,您可以在集合上实现 xrange的逻辑如下: >>> reversed(xrange(100)) <rangeiterator object at 0xb72aab78> >>> it = reversed(xrange(100)).__iter__() >>> it <rangeiterator ob

如何在Python中实现类似的东西?更具体地说,我如何制作一个迭代器,它可以被反转,而不必在反转之前在内存中列出它?

基本上,您可以在集合上实现

xrange
的逻辑如下:

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

这里没有技巧——您需要知道如何生成反向迭代器。Python并不是为您而做的。

基本上,您是在集合上实现的

xrange
的逻辑如下:

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

这里没有技巧——您需要知道如何生成反向迭代器。Python不会为您这样做。

如果您的迭代器实现了方法
\uuuu reversed\uuuu()
,则内置的
reversed()
将使用该方法
xrange()
返回执行此操作的迭代器。

如果迭代器实现了方法
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
xrange()
返回执行此操作的迭代器。

反向
将处理两种类型的对象:

  • 序列(如
    列表
  • 具有
    \uuuuu反向\uuuuu
    魔术方法的迭代器
如果您有一个自定义序列,并且您可以使用该序列的
len()
,那么您就可以开始了——否则,您需要添加
\uu len\uu
魔术方法;如果不能(例如,因为长度未知),则不能延迟反转

如果您有一个自定义迭代器,那么请确保它具有
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
神奇方法:
\uuuuuuuu;同样,如果您不能提供一个(例如,因为长度未知),那么您不能懒洋洋地反转它


注意:有关创建自定义iterables的更多信息,请参阅。

reversed
将使用两种类型的对象:

  • 序列(如
    列表
  • 具有
    \uuuuu反向\uuuuu
    魔术方法的迭代器
如果您有一个自定义序列,并且您可以使用该序列的
len()
,那么您就可以开始了——否则,您需要添加
\uu len\uu
魔术方法;如果不能(例如,因为长度未知),则不能延迟反转

如果您有一个自定义迭代器,那么请确保它具有
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
神奇方法:
\uuuuuuuu;同样,如果您不能提供一个(例如,因为长度未知),那么您不能懒洋洋地反转它


注意:有关创建自定义iterables的更多信息,请参阅。

您询问如何使用reversed()创建一个可逆的迭代器而不会变得太贵,我说得对吗?您询问如何使用reversed()创建一个可逆的迭代器而不会变得太贵,我说得对吗?