Loading lesson path
Generators are functions that can pause and resume their execution. When a generator function is called, it returns a generator object, which is an iterator. The code inside the function is not executed yet, it is only compiled. The function only executes when you iterate over the generator.
def my_generator():
yield 1 yield 2 yield 3 for value in my_generator():
print(value)Generators allow you to iterate over data without storing the entire dataset in memory.
Instead of using return, generators use the yield keyword.The yield keyword is what makes a function a generator.
When yield is encountered, the function's state is saved, and the value is returned. The next time the generator is called, it continues from where it left off.def count_up_to(n):Formula
count = 1 while count <= n:yield count count += 1 for num in count_up_to(5):
print(num)
Unlike return, which terminates the function, yield pauses it and can be called multiple times.Formula
Generators are memory - efficient because they generate values on - the - fly instead of storing everything in memory.
For large datasets, generators save memory:def large_sequence(n):
for i in range(n):yield i
Formula
# This doesn't create a million numbers in memory gen = large_sequence(1000000)print(next(gen))
print(next(gen))
print(next(gen))You can manually iterate through a generator using the next() function:
def simple_gen():
yield "Emil"
yield "Tobias"
yield "Linus"Formula
gen = simple_gen()print(next(gen))
print(next(gen))
print(next(gen))When there are no more values to yield, the generator raises a
def simple_gen():Formula
yield 1 yield 2 gen = simple_gen()print(next(gen))
print(next(gen))
print(next(gen)) # This will raise StopIterationSimilar to list comprehensions, you can create generators using generator expressions with parentheses instead of square brackets:
Formula
# List comprehension - creates a list list_comp = [x * x for x in range(5)]print(list_comp)Formula
# Generator expression - creates a generator gen_exp = (x * x for x in range(5))print(gen_exp)
print(list(gen_exp))Using a generator expression with sum:
Formula
# Calculate sum of squares without creating a list total = sum(x * x for x in range(10))print(total)Generators can be used to create the Fibonacci sequence. It can continue generating values indefinitely, without running out of memory:
def fibonacci():Formula
a, b = 0, 1 while True:
yield a a, b = b, a + b
# Get first 100 Fibonacci numbers gen = fibonacci()
for _ in range(100):print(next(gen))Generators have special methods for advanced control: send() Method
method allows you to send a value to the generator:
def echo_generator():while True:
received = yield print("Received:", received)Formula
gen = echo_generator()next(gen) # Prime the generator gen.send("Hello") gen.send("World") close() Method
method stops the generator: