Developed By
Gautam Kumar - Full stack developer
DEEP DIVE INTO
In Python, iterators and iterables
are fundamental concepts related to iterating over collections of data, such as lists, tuples, dictionaries, and more. Understanding these concepts is crucial for working with data structures in Python effectively.
An iterable
is any object in Python that can be looped over or iterated. It can be a collection of items like a list, tuple, string, dictionary, or any custom object that implements the special methods __iter__() and __next__(). The __iter__() method returns an iterator, and the __next__() method defines how to retrieve the next item from the iterable
. However, in practice, most iterables
do not implement these methods directly; they rely on the Python interpreter's built-in implementation.
Here's an example of a simple iterable
, a custom range-like class:
pythonclass MyRange:
def __init__(self, start, end):
self.start = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.start >= self.end:
raise StopIteration
current = self.start
self.start += 1
return current
# Using the iterable
my_range = MyRange(1, 5)
for num in my_range:
print(num)
In this example, MyRange
is an iterable
because it implements the __iter__() and __next__() methods.
An iterator
is an object that represents the stream of data or items from an iterable
. An iterator is created from an iterable using the iter() function. The iterator
keeps track of the current position within the iterable
and can fetch the next item using the next() function. When there are no more items to fetch, the iterator
raises a StopIteration
exception.
Here's an example of using an iterator
with a list:
pythonmy_list = [1, 2, 3, 4, 5]
my_iterator = iter(my_list)
print(next(my_iterator)) # Output: 1
print(next(my_iterator)) # Output: 2
The iteration protocol in Python defines how iteration
works:
An
is an object that implements the __iter__() method, which returns an iterable
iterator
.
An iterator
is an object that implements the __next__() method, which returns the next item in the sequence.
When there are no more items to be returned, the __next__() method should raise a StopIteration
exception.
You can iterate over an iterable
using a for loop or by manually calling next() on the iterator
.
Python provides several built-in iterables
, including lists, tuples, dictionaries, strings, sets, and more. These objects are iterable
out of the box, allowing you to loop through their elements without needing to define custom __iter__() and __next__() methods.
For example, you can iterate
over a list like this:
pythonmy_list = [1, 2, 3, 4, 5]
for num in my_list:
print(num)
Python has built-in functions to work with iterables
and iterators
:
iter(iterable): Returns an iterator for the iterable
.
next(iterator, default): Retrieves the next item from the iterator
. If there are no more items, it raises StopIteration
, or returns default if provided.
iterable.__iter__(): Returns an iterator
for the iterable
(you rarely need to use this directly).
iterator.__next__(): Returns the next item from the iterator
(you rarely need to use this directly).
Generator functions
are a convenient way to create custom iterators
in Python. They use the yield keyword to produce a value and save the function's state. When you call the generator function
, it doesn't execute the entire function at once but returns an iterator that executes the function step by step.
Here's an example of a simple generator function:
pythondef countdown(n):
while n > 0:
yield n
n -= 1
# Using the generator function
for i in countdown(5):
print(i)
Generators
are memory-efficient and useful for creating iterators
that produce values on-the-fly.
In summary, iterables
are objects that can be looped over, and iterators
are objects that represent the state of the iteration
within an iterable
. Understanding the distinction between these two concepts is essential for working with collections and custom data structures in Python. Whether you're working with built-in iterables
or creating your own iterators
, mastering these concepts is key to effective Python programming.