Generators in Python are a special type of iterator that allows you to iterate over a sequence of values lazily—that is, one value at a time and only when needed. Instead of using the return
statement to return a value and terminate the function, generators use the yield
statement to produce a value and then pause the function, resuming where it left off the next time the generator is called.
This is especially useful when dealing with large datasets or streams of data where loading everything into memory at once would be inefficient or impossible. Generators help in managing memory more efficiently and can be used to create custom iterators.
def fibonacci_sequence(limit):
a, b = 0, 1
while a < limit:
yield a
a, b = b, a + b
# Create a generator object
fib_gen = fibonacci_sequence(10)
# Iterate through the generated sequence
for num in fib_gen:
print(num)
def fibonacci_sequence(limit):
This line defines a generator function called fibonacci_sequence
. It takes a single argument limit
, which sets the upper bound for the Fibonacci sequence values.
while a < limit:
This loop continues as long as a
is less than the specified limit
. It’s the main loop where the Fibonacci sequence is generated.
yield a
The yield
statement is used to return the current value of a
to the caller without terminating the function. The function’s state is preserved, allowing it to resume from where it left off the next time it’s called.
a, b = b, a + b
After yielding a value, the variables a
and b
are updated. a
takes the value of b
, and b
is updated to the sum of the old a
and b
. This step is crucial in generating the next number in the Fibonacci sequence.
fib_gen = fibonacci_sequence(10)
Here, a generator object fib_gen
is created by calling the fibonacci_sequence
function with an argument of 10
. This means the generator will produce Fibonacci numbers up to but not including 10.
for num in fib_gen:
print(num)
This loop iterates over the generator object fib_gen
. Each time the loop runs, it calls the generator function, which resumes execution until the next yield
statement. The value yielded is then printed. The loop continues until the generator is exhausted (i.e., when the condition a < limit
fails).
fib_gen = fibonacci_sequence(10)
is executed, it does not run the function immediately. Instead, it returns a generator object that can be iterated over.yield
statement, returning the value 0
and pausing the function.yield
statement, continuing until the next yield
, and so on.a
becomes equal to or greater than the limit), at which point the loop terminates.This approach to generating sequences is not only memory-efficient but also allows for potentially infinite sequences, which can be terminated based on a condition rather than having to compute all elements upfront.