如何在 python 中创建迭代器 class 以相反的顺序迭代输入?

How to create an iterator class in python that will iterate through an input in reverse order?

我需要创建一个迭代器 class 以相反的顺序迭代输入。我几乎需要使用 class.

复制以下代码
def reverse(iterable)
    rev = len(iterable) - 1
    while rev >= 0:
        yield iterable[rev]
        rev -=1

代码应该像这样工作:

>>> nums = [1, 5, 6]
>>> ex = RevIter(nums)
>>> iter(ex) is ex
True
>>> next(ex) == 6
True
>>> next(ex)
5
>>> next(ex)
1

我的代码目前无法运行:

class RevIter:

    def __init__(self,iterable):        
        self.iterable = iterable
   
    def __next__(self):        
        rev = len(iterable) - 1        
        while rev >=0:            
        yield iterable[rev]            
        rev -= 1

注意:我不能使用任何内置函数,例如 reverse() 或 iter()

您不能在__next__特殊方法中使用yieldyield是为生成器保留的。

这里有一个实施提示:

class RevIter:
    def __init__(self, iterable):        
        self.iterable = iterable
        self.index = len(iterable)
   
    def __next__(self):
        # Maybe update self.index to prepare it for the next element?
        return # Maybe return something using the iterable and the index?

考虑更新应该如何进行,想象一下当单步执行一个 5 元素列表时,索引将(按顺序)

4, 3, 2, 1, 0

可迭代class中的__next__方法不是 生成器本身 - 它是一个简单的函数 returns 一个值,作为迭代器的一部分调用 协议。

__iter__特殊的class可以随意 成为生成器和特征 yield。但是,如果你打电话 iter(myinstance),其中 __iter__ 是一个生成器 函数(即具有 yield 关键字的函数), iter 调用将创建一个新的可迭代实例,即 不同于 myinstance

要使 mysinstance is iter(myinstance) 部分正常工作, 您必须具有 return 和 selfiter 方法。 __next__ 方法将 return 下一个所需的项目。

class RevIter:

    def __init__(self,iterable):        
        self.iterable = list(iterable)
        self.index = len(self.iterable)

    def __iter__(self):
        # if you want the instance to be able to reset the iteration,
        # redefine "self.index" here.
        # self.index = len(self.iterable)
        # this is what "iter(instance)" becomes:
        return self
   
    def __next__(self):        
        self.index -= 1
        if self.index < 0:
             raise StopIteration()
        return self.iterable[self.index]