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
- yield: Return value and pause function
- next(): Get next value from generator
- Memory efficient: Values generated on demand
- Generator expression: (expr for item in iterable)
- One-time use: Can only iterate once
- Lazy evaluation: Values computed when needed