⚡ Generators

Memory-Efficient Iteration

Python Generators

Generators are iterators that generate values on-the-fly using yield instead of storing all values in memory. Perfect for large datasets.

💻 Generator Functions

# Regular function returns list (stores in memory)
def get_squares_list(n):
    result = []
    for i in range(n):
        result.append(i**2)
    return result

# Generator function yields values one at a time
def get_squares_gen(n):
    for i in range(n):
        yield i**2

# Usage
gen = get_squares_gen(5)
print(next(gen))  # 0
print(next(gen))  # 1

for square in get_squares_gen(5):
    print(square)  # 0, 1, 4, 9, 16

🔧 Generator Expressions

# List comprehension (creates full list)
squares_list = [x**2 for x in range(1000000)]

# Generator expression (creates generator)
squares_gen = (x**2 for x in range(1000000))

# Convert to list when needed
result = list(squares_gen)

# Use in sum/max/min
total = sum(x**2 for x in range(100))

📚 Practical Example

# Reading large files efficiently
def read_large_file(file_path):
    with open(file_path, 'r') as file:
        for line in file:
            yield line.strip()

# Use generator
for line in read_large_file('big_data.txt'):
    process(line)  # Process one line at a time

# Infinite generators
def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

🎯 Key Takeaways