如何在 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__
特殊方法中使用yield
,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
可迭代class中的__next__
方法不是
生成器本身 - 它是一个简单的函数
returns 一个值,作为迭代器的一部分调用
协议。
是__iter__
特殊的class可以随意
成为生成器和特征 yield
。但是,如果你打电话
iter(myinstance)
,其中 __iter__
是一个生成器
函数(即具有 yield
关键字的函数),
iter
调用将创建一个新的可迭代实例,即
不同于 myinstance
要使 mysinstance is iter(myinstance)
部分正常工作,
您必须具有 return 和 self
的 iter
方法。
__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]
我需要创建一个迭代器 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__
特殊方法中使用yield
,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
可迭代class中的__next__
方法不是
生成器本身 - 它是一个简单的函数
returns 一个值,作为迭代器的一部分调用
协议。
是__iter__
特殊的class可以随意
成为生成器和特征 yield
。但是,如果你打电话
iter(myinstance)
,其中 __iter__
是一个生成器
函数(即具有 yield
关键字的函数),
iter
调用将创建一个新的可迭代实例,即
不同于 myinstance
要使 mysinstance is iter(myinstance)
部分正常工作,
您必须具有 return 和 self
的 iter
方法。
__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]