Introduction
Iterators are objects that implement the iterator protocol with iter and next methods. They provide a way to traverse collections lazily.
Basic Iterator
class Counter:
def __init__(self, limit):
self.current = 0
self.limit = limit
def __iter__(self):
return self
def __next__(self):
if self.current >= self.limit:
raise StopIteration
result = self.current
self.current += 1
return result
for i in Counter(5):
print(i) # 0, 1, 2, 3, 4
Iterator from Iterable
class FileLines:
def __init__(self, filename):
self.filename = filename
def __iter__(self):
with open(self.filename, "r") as f:
for line in f:
yield line.rstrip()
for line in FileLines("data.txt"):
print(line)
Infinite Iterator
class Fibonacci:
def __init__(self):
self.a, self.b = 0, 1
def __iter__(self):
return self
def __next__(self):
result = self.a
self.a, self.b = self.b, self.a + self.b
return result
fib = Fibonacci()
for i in range(10):
print(next(fib)) # 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Iterator with StopIteration
class RangeIterator:
def __init__(self, start, stop):
self.current = start
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.current >= self.stop:
raise StopIteration
value = self.current
self.current += 1
return value
Built-in Iterator Functions
items = [1, 2, 3]
iterator = iter(items)
print(next(iterator)) # 1
print(next(iterator, "default")) # 2
print(next(iterator, "default")) # 3
print(next(iterator, "default")) # default
Practice Problems
- Create iterator for even numbers
- Implement iterator from list
- Build infinite generator
- Use iter() and next() functions
- Create iterator with state