As we mentioned earlier, a for loop only needs an iterable object. Lists, in particular, are iterable objects. This means that a list is able to create an iterator from its contents. In fact, this is true for any object (not only lists): any object may be made iterable.
This is achieved via the method __iter__, which should return an iterator. Here we give an example where the method __iter__ is a generator:
class OdeStore:
"""
Class to store results of ode computations
"""
def __init__(self, data):
"data is a list of the form [[t0, u0], [t1, u1],...]"
self.data = data
def __iter__(self):
"By default, we iterate on the values u0, u1,..."
for t, u in self.data:
yield u
store = OdeStore([[0, 1], [0.1, 1.1], [0.2, 1.3]])
for u in store:
print(u)
# result: 1, 1.1, 1.3
list(store) # [1, 1.1, 1...