Swiftorial Logo
Home
Swift Lessons
Matchups
CodeSnaps
Tutorials
Career
Resources

Iterators and Generators in Python

1. Introduction

In Python, iterators and generators are essential tools for managing data streams and sequences. This lesson will cover:

  • What iterators are and how to use them.
  • What generators are and how they differ from iterators.
  • Best practices for using these concepts effectively.

2. Iterators

An iterator is an object that implements the __iter__() and __next__() methods, allowing sequential access to its elements.

Key Concepts

  • Iterable: An object capable of returning its members one at a time (e.g., lists, tuples).
  • Iterator: An object that keeps track of the current position in the iterable.

Creating an Iterator

To create a custom iterator, define a class with __iter__() and __next__() methods:

class MyIterator:
    def __init__(self, limit):
        self.limit = limit
        self.current = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.current < self.limit:
            value = self.current
            self.current += 1
            return value
        else:
            raise StopIteration

iterator = MyIterator(5)
for num in iterator:
    print(num)  # Outputs: 0, 1, 2, 3, 4
        

3. Generators

Generators are a simpler way to create iterators using the yield statement. Instead of returning a value and terminating, yield saves the state of the function and allows it to resume from where it left off.

Creating a Generator

Here's how to create a generator function:

def my_generator(limit):
    current = 0
    while current < limit:
        yield current
        current += 1

for num in my_generator(5):
    print(num)  # Outputs: 0, 1, 2, 3, 4
        

4. Comparison

While both iterators and generators can be used to iterate over data, they have key differences:

Iterators vs. Generators

  • Iterators require a class with __iter__() and __next__() methods.
  • Generators are simpler and use function syntax with yield.
  • Generators can be more memory efficient since they yield items one at a time.

5. Best Practices

Here are some best practices when using iterators and generators:

  • Use generators for large datasets to save memory.
  • Keep iterator classes simple and focused on a single responsibility.
  • Always handle StopIteration exceptions properly when using iterators.

6. FAQ

What is the difference between an iterable and an iterator?

An iterable is an object that can return an iterator (e.g., lists, tuples), while an iterator is the object that actually iterates over the iterable, maintaining the current state.

Can a generator function return values?

No, generator functions use yield to produce values. They can be resumed to produce more values but do not return in the traditional sense.

Are generators faster than iterators?

Generators are generally more memory efficient and can be faster for large datasets since they avoid storing all items in memory.