如何在python中创建一个迭代器类,该迭代器类将以相反的顺序迭代输入?

问题描述

我需要创建一个迭代器类,它将以相反的顺序遍历输入。我几乎需要使用类来复制以下代码

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()

解决方法

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

以下是实现的提示:

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
,

可迭代类中的__next__方法不是 生成器本身-这是一个简单的函数 返回一个值,称为迭代器的一部分 协议。

__iter__特殊类可以选择 成为生成器和功能yield。但是,如果你打电话 iter(myinstance),其中__iter__是生成器 函数(即具有yield关键字的函数), iter调用将创建一个新的可迭代实例,该实例 与myinstance

不同

要使mysinstance is iter(myinstance)部分正常工作, 您必须具有返回iter的{​​{1}}方法。 还有一个self方法将返回下一个所需的项目。

__next__