-1

Write a generator function reverse_iter that accepts an iterable sequence and yields the items in reverse order without using built-in functions or methods. After using the function however, the original list should be unchanged. An example output is below:

   it = reverse_iter(nums)
    next(it) == 4
True
    next(it)
3
    next(it)
2
    next(it)
1

Note that the above should work even if the list is changed to a tuple. I have no idea how to do this without using something like reverse() or reversed(). Maybe utilize a -1 slice? Any Ideas?

user10019227
  • 117
  • 1
  • 2
  • 7

1 Answers1

-2
def reverse_iter(nums): # A generator function
    idx = len(nums) - 1
    while idx > -1:
        yield nums[idx]
        idx -=1 

nums = [1,2,3,4]
print('before: ',*nums)
get = reverse_iter(nums)  # get is a generator object

print('manually')
# Iterating over the generator object using next
print(get.__next__()) # In Python 3+ , print(get.__next__())
print(get.__next__())
print(get.__next__())
print(get.__next__())

#print(get.next()) #now you will get StopIteration
#print(next(get,'traversing complete')) #to avoid the StopIteration exception


# printing all items in list in reverse 
print('\nusing for loop')
get = reverse_iter(nums)  # get is a generator object
for i in range(len(nums)):
    print(get.__next__())

print('after: ',*nums)
Tanmay jain
  • 814
  • 6
  • 11