Generators are a type of iterable that allow you to iterate over a potentially large sequence of data without storing it all in memory.
Generators are defined using functions with the yield keyword, which temporarily suspends the function's state and allows it to resume from where it left off.
They are particularly useful for processing large datasets or creating custom iterators.