Table of Contents
- Introduction
- Prerequisites
- Creating an Iterator
- Iterating Over an Object
- Stop Iteration
- Examples
- Conclusion
Introduction
In Python, an iterator is an object that allows sequential access to elements of a container object. By creating custom iterators, we can define our own iteration behavior for objects. In this tutorial, we will learn how to create custom iterators in Python.
By the end of this tutorial, you will be able to:
- Understand the concept of iterators in Python
- Create custom iterators for your own objects
- Use custom iterators to iterate over different collections
Prerequisites
To follow along with this tutorial, you should have a basic understanding of Python programming. Familiarity with object-oriented programming concepts will also be helpful.
Creating an Iterator
To create an iterator, we need to define a class that implements the __iter__()
and __next__()
methods. The __iter__()
method returns the iterator object itself, and the __next__()
method returns the next value from the iterator.
Let’s create a simple example of a custom iterator that iterates over a list of names: ```python class NameIterator: def init(self, names): self.names = names self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.names):
current_name = self.names[self.index]
self.index += 1
return current_name
else:
raise StopIteration
``` In the above code, we define the `NameIterator` class with an `__init__()` method that takes a list of names as input and initializes the index to 0. The `__iter__()` method simply returns the iterator object itself (`self`), and the `__next__()` method checks if the index is within the length of the list. If it is, it returns the current name and increments the index. Otherwise, it raises the `StopIteration` exception to signal the end of iteration.
Iterating Over an Object
To iterate over an object using our custom iterator, we can use a for
loop or call the built-in iter()
and next()
functions.
Let’s create a list of names and use the NameIterator
to iterate over them:
```python
names = [“Alice”, “Bob”, “Charlie”]
iterator = NameIterator(names)
# Using a for loop
for name in iterator:
print(name)
# Using iter() and next()
iterator = iter(iterator)
print(next(iterator))
print(next(iterator))
print(next(iterator))
``` The output will be:
```
Alice
Bob
Charlie
Alice
Bob
Charlie
``` In the first example, we use a `for` loop to iterate over the `NameIterator` object, which automatically calls the `__iter__()` method and then the `__next__()` method until `StopIteration` is raised.
In the second example, we manually call the iter()
function on the NameIterator
object to get the iterator, and then call next()
on the iterator to get the next value.
Stop Iteration
The StopIteration
exception is used to signal the end of the iteration. When an iterator reaches the end, it should raise this exception.
If you omit the StopIteration
exception, the iteration will continue indefinitely, resulting in an infinite loop.
Examples
Let’s explore a few more examples to solidify our understanding.
Example 1: Range Iterator
```python
class RangeIterator:
def __init__(self, start, stop):
self.start = start
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.start < self.stop:
current_value = self.start
self.start += 1
return current_value
else:
raise StopIteration
numbers = RangeIterator(1, 4)
for number in numbers:
print(number)
``` Output:
```
1
2
3
``` In this example, we create a `RangeIterator` class that iterates over a range of numbers. The `__next__()` method returns the current value and increments the `start` attribute until it reaches the `stop` value.
Example 2: File Reader Iterator
```python
class FileReader:
def __init__(self, file_path):
self.file_path = file_path
def __iter__(self):
self.file = open(self.file_path, "r")
return self
def __next__(self):
line = self.file.readline()
if line:
return line.strip()
else:
self.file.close()
raise StopIteration
lines = FileReader("data.txt")
for line in lines:
print(line)
``` Output (assuming `data.txt` contains three lines):
```
Line 1
Line 2
Line 3
``` In this example, we create a `FileReader` class that iterates over the lines of a text file. The `__iter__()` method opens the file and returns the iterator object. The `__next__()` method reads the next line and returns it, stripping any leading or trailing whitespace. When there are no more lines, it closes the file and raises `StopIteration`.
Conclusion
In this tutorial, we have learned how to create custom iterators in Python. We saw that an iterator requires the __iter__()
and __next__()
methods to be implemented. Using custom iterators, we can define our own iteration behavior for objects and easily iterate over them using for
loops or the iter()
and next()
functions.
Now that you understand the basics of creating custom iterators, you can use this knowledge to make your code more efficient and expressive. Experiment with different types of iterators and explore their applications in various scenarios.
Happy iterating!