It remembers its state i.e., where it is during iteration (SEE code below to see how)
__iter__() method initializes an iterator.
It has a __next__() method which returns the next item in iteration and points to the next element. Upon reaching the end of iterable object __next__() must return StopIteration exception.
It is also self-iterable.
Iterators are OBJECTS with which we can iterate over iterable objects LIKE lists, strings, etc.