Python generators are a powerful tool for performing lazy iteration. Unlike lists, which store all their elements in memory, generators generate values on-the-fly, making them memory-efficient for large data sets. In this guide, we'll explore Python generators, what they are, how to create them, and why they are valuable for lazy iteration.

What Are Generators?

Generators are functions that yield values one at a time using the yield keyword. They can be thought of as special iterators that generate values as they are needed, rather than storing them in memory. Generators are often used for processing large data sets or infinite sequences.

Creating and Using Generators

Let's explore how to create and use generators in Python with sample code:

1. Basic Generator Function

# Creating a basic generator function
def simple_generator():
yield 1
yield 2
yield 3
# Using the generator
gen = simple_generator()
for value in gen:

2. Lazy Iteration with a Generator

# Generating an infinite sequence of even numbers
def even_numbers():
n = 0
while True:
yield n
n += 2
# Using the generator for lazy iteration
evens = even_numbers()
for i in range(5):

3. Generator Expressions

# Creating a generator expression to calculate squares of numbers
squares = (x**2 for x in range(1, 6))
# Using the generator expression for lazy iteration
for square in squares:

Advantages of Generators

Python generators offer several advantages, including:

  • Memory efficiency for large data sets.
  • Lazy evaluation, which means values are generated only when needed.
  • The ability to represent infinite sequences.
  • Reduced computation time for complex operations on data.


Python generators are a valuable tool for handling lazy iteration, large data sets, and infinite sequences. They provide a memory-efficient and on-demand way to generate and process data, making them a key component in Python's toolbox for data manipulation and processing.