Python Generators
Generators produce values lazily and retain their execution state between yields. They are useful for processing streams or large collections without materializing every value in memory.
Lazy iterators produced by generator functions and expressions.