How to Build a basic Iterator in Python?
Last Updated :
03 Jun, 2024
Iterators are a fundamental concept in Python, allowing you to traverse through all the elements in a collection, such as lists or tuples. While Python provides built-in iterators, there are times when you might need to create your own custom iterator to handle more complex data structures or operations. In this article, we will explore how to build a basic iterator in Python from scratch.
What is an Iterator?
An iterator in Python is an object that implements two methods: __iter__() and __next__(). The __iter__() method returns the iterator object itself and is called once at the beginning of an iteration. The __next__() method returns the next value from the sequence and raises a StopIteration exception when there are no more items to return.
Define the Iterator Class:
- __init__: The constructor initializes the maximum value (max_n) and the current value (current), which starts at 0.
- __iter__: This method returns the iterator object itself. It is called once at the beginning of the iteration.
- __next__: This method calculates the square of the current value, increments the current value, and returns the result. If the current value exceeds max_n, it raises a StopIteration exception to signal the end of the iteration.
Why Use Custom Iterators?
Custom iterators allow you to:
- Encapsulate complex iteration logic.
- Maintain state between iterations.
- Generate values on the fly (lazy evaluation), which can be more memory-efficient for large datasets.
Example 1: Building a Basic Custom Iterator
Let's build a basic iterator that generates a sequence of square numbers. We'll start by creating a class that implements the iterator protocol.
Initialization: The SquareIterator class is initialized with a maximum value max_n, which determines how many squares will be generated. The current attribute keeps track of the current number being squared.
Iteration: The __iter__ method is straightforward; it returns the iterator object itself (self). This method is necessary to make our object an iterator.
Generating Values: The __next__ method is where the core logic resides. It checks if the current value has exceeded the maximum (max_n). If it has, it raises a StopIteration exception, which stops the iteration. Otherwise, it calculates the square of the current value, increments current, and returns the squared value.
Python
class SquareIterator:
def __init__(self, max_n):
self.max_n = max_n
self.current = 0
def __iter__(self):
return self
def __next__(self):
if self.current > self.max_n:
raise StopIteration
result = self.current ** 2
self.current += 1
return result
# Using the custom iterator
square_iter = SquareIterator(5)
for num in square_iter:
print(num)
Output:
0
1
4
9
16
25
Example 2: Building a Fibonacci Iterator
We'll create an iterator that generates Fibonacci numbers up to a specified limit.
- Class Definition:
FibonacciIterator
is defined with an __init__
method that initializes the starting values of the Fibonacci sequence (self.a
and self.b
) and the limit up to which the numbers should be generated. - Iterator Method: The
__iter__
method returns the iterator object itself. - Next Method: The
__next__
method generates the next number in the Fibonacci sequence. If the current number exceeds the specified limit, it raises a StopIteration
exception. - Using the Iterator: The iterator can be used with a
for
loop or the next()
function to generate and print Fibonacci numbers up to the specified limit.
Python
class FibonacciIterator:
def __init__(self, limit):
self.limit = limit
self.a = 0
self.b = 1
def __iter__(self):
return self
def __next__(self):
if self.a > self.limit:
raise StopIteration
current = self.a
self.a, self.b = self.b, self.a + self.b
return current
# Create an instance of FibonacciIterator
fib_iterator = FibonacciIterator(100)
# Using a for loop to iterate
print("Using for loop:")
for num in fib_iterator:
print(num)
# Using next() to iterate
print("\nUsing next() function:")
fib_iterator = FibonacciIterator(100)
print(next(fib_iterator))
print(next(fib_iterator))
print(next(fib_iterator))
print(next(fib_iterator))
print(next(fib_iterator))
print(next(fib_iterator))
print(next(fib_iterator))
print(next(fib_iterator))
print(next(fib_iterator))
print(next(fib_iterator))
print(next(fib_iterator))
print(next(fib_iterator))
Output:
Using for loop:
0
1
1
2
3
5
8
13
21
34
55
89
Using next() function:
0
1
1
2
3
5
8
13
21
34
55
89
Conclusion
Building a custom iterator in Python is a powerful way to create more complex and memory-efficient data traversal mechanisms. By implementing the __iter__ and __next__ methods, you can control the iteration logic and manage state between iterations. The example provided here demonstrates how to create a simple iterator that generates square numbers, but the principles can be applied to more complex scenarios as well.
Similar Reads
How to iterate over files in directory using Python?
Iterating over files in a directory using Python involves accessing and processing files within a specified folder. Python provides multiple methods to achieve this, depending on efficiency and ease of use. These methods allow listing files, filtering specific types and handling subdirectories.Using
3 min read
Iterate over a dictionary in Python
In this article, we will cover How to Iterate Through a Dictionary in Python. To Loop through values in a dictionary you can use built-in methods like values(), items() or even directly iterate over the dictionary to access values with keys.How to Loop Through a Dictionary in PythonThere are multipl
6 min read
How To Do Pagination In Python
In this article, we'll walk you through the steps of setting up pagination in Python. We'll explain each step clearly and straightforwardly. To help you understand the idea of pagination in Python, we'll show you how to create a pagination system using the Tkinter library. We'll start by explaining
5 min read
Iterate over a set in Python
The goal is to iterate over a set in Python. Since sets are unordered, the order of elements may vary each time you iterate. You can use a for loop to access and process each element, but the sequence may change with each execution. Let's explore different ways to iterate over a set.Using for loopWh
2 min read
How to create a list of object in Python class
In Python, creating a list of objects involves storing instances of a class in a list, which allows for easy access, modification and iteration. For example, with a Geeks class having attributes name and roll, you can efficiently manage multiple objects in a list. Let's explore different methods to
3 min read
Combinatoric Iterators in Python
An iterator is an object that can be traversed through all its values. Simply put, iterators are data type that can be looped upon. Generators are iterators but as they cannot return values instead they yield results when they are executed, using the 'yield' function. Generators can be recursive jus
4 min read
Pass a List to a Function in Python
In Python, we can pass a list to a function, allowing to access or update the list's items. This makes the function more versatile and allows us to work with the list in many ways.Passing list by Reference When we pass a list to a function by reference, it refers to the original list. If we make any
2 min read
How to Get a List of Class Attributes in Python?
A class is a user-defined blueprint or prototype from which objects are created. Classes provide a means of bundling data and functionality together. Creating a new class creates a new type of object, allowing new instances of that type to be made. Each class instance can have attributes attached to
4 min read
Iterate over a tuple in Python
Python provides several ways to iterate over tuples. The simplest and the most common way to iterate over a tuple is to use a for loop. Below is an example on how to iterate over a tuple using a for loop.Pythont = ('red', 'green', 'blue', 'yellow') # iterates over each element of the tuple 't' # and
2 min read
How to add Elements to a List in Python
In Python, lists are dynamic which means that they allow further adding elements unlike many other languages. In this article, we are going to explore different methods to add elements in a list. For example, let's add an element in the list using append() method:Pythona = [1, 2, 3] a.append(4) prin
2 min read