Python generators provide a memory-efficient way to handle large data sets or streams of data. They are created using functions and the yield statement. Unlike regular functions that return a single value and terminate, generators can yield multiple values, pausing after each yield and resuming from there on the next call.
def number_generator(n): for i in range(n): yield i # Using the generator to print numbers my_generator = number_generator(5) for num in my_generator: print(num)
When you call simple_generator(), it returns a generator object. You can iterate over this object to execute the function up to the next yield statement. This allows generators to maintain state between yields.
Generators are particularly useful for generating large sequences. For instance, an infinite sequence generator doesn’t store all values in memory.
This prints the first five numbers of an infinite sequence without exhausting memory.
Generator expressions provide a concise way to create generators, similar to list comprehensions but using parentheses.
Generators are ideal for tasks like reading large files line by line, processing streaming data, or managing any large or infinite sequence of values, ensuring that only one item is in memory at a time. This makes them invaluable for efficient and scalable Python programming.
def filter_even(numbers): for number in numbers: if number % 2 == 0: yield number # Using the generator numbers = range(10) even_numbers = filter_even(numbers) for even in even_numbers: print(even)