from typing import Sequenceclass ReverseSequence(object):def __init__(self, sequence: Sequence): self.sequence = sequence # reference to container self.index =len(sequence) # currentindex #Step 1.define __iter__ method whitch returns self.def __iter__(self): return self #Step 2.define __next__ method # rasing StopIterationat the end of iteration.def __next__(self): if self.index> 0: self.index = self.index - 1 #nextindex return self.sequence[self.index] else: raise StopIterationclass ReverseSequenceGenerator(object):def __init__(self, sequence: Sequence): self.sequence = sequence self.index =len(sequence)def __iter__(self): while self.index> 0: self.index = self.index - 1 yield self.sequence[self.index] raise StopIterationassert list.__eq__( [element for element in ReverseSequence('spam')], [element for element in ReverseSequenceGenerator('spam')])
class Reverse:def __init__(self, data): self.data = data self.index =len(data)def __iter__(self): return selfdef __next__(self): if self.index == 0: raise StopIteration self.index = self.index - 1 return self.data[self.index]class ReverseGenerator:def __init__(self, data): self.data = data self.index =len(data)def __iter__(self): whileTrue: if self.index == 0: raise StopIteration self.index = self.index - 1 yield self.data[self.index]assert [s for s in Reverse('spam')] == [s for s in ReverseGenerator('spam')]