Skip to main content

Generators in Python

Hey there! In this guide, we'll explore generators in Python. Generators are a special type of iterable that allow you to create iterators in a very concise and efficient way. They are useful for managing large datasets and for situations where you want to yield results incrementally. Let's dive in!


Python Generators​

  • Iterators: Generators are a type of iterator that generate values on the fly and do not store them in memory.
  • Yield Statement: Generators use the yield statement to produce a value and pause the function’s state, allowing it to resume later.

1. Defining a Simple Generator​

You can define a generator function using the yield keyword.

def simple_generator():
yield 1
yield 2
yield 3

gen = simple_generator() # Create a generator object
print(next(gen)) # Output: 1
print(next(gen)) # Output: 2
print(next(gen)) # Output: 3
# print(next(gen)) # Raises StopIteration error

2. Using a Generator in a Loop​

Generators can be used in a loop to retrieve values until the generator is exhausted.

def countdown(n):
while n > 0:
yield n
n -= 1

for number in countdown(5):
print(number) # Output: 5, 4, 3, 2, 1

3. Generator Expressions​

You can create generators using a generator expression, which is similar to list comprehensions but uses parentheses instead of brackets.

squared_numbers = (x**2 for x in range(5))

for square in squared_numbers:
print(square) # Output: 0, 1, 4, 9, 16

4. Advantages of Generators​

  • Memory Efficiency: Generators do not store the entire list in memory, making them more memory-efficient than lists.
  • Lazy Evaluation: Values are computed on-the-fly, allowing for more efficient use of resources.

5. Practical Use Case: Fibonacci Sequence​

Here’s an example of a generator that produces Fibonacci numbers.

def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b

for num in fibonacci(10):
print(num) # Output: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34