Enrol to start learning
Reading is open to everyone. Enrolling is free, and it is what unlocks the audio lessons, practice tests and progress tracking.
3.4. Using yield and yield from
Interactive Audio Lesson
Unlock the classroom podcast
The transcript is above and free to read. A free account plays the conversation back.
Create a free accountToday, we're going to explore the yield keyword in Python. Can anyone explain what a generator is?
A generator is a function that can yield values, right?
Exactly! When we use yield, we pause the function, allowing Python to return a value. For instance, with yield 1, we can start the function and then use next() to retrieve the value one at a time. This is also memory efficient.
How does it remember its state?
Great question! The generator remembers its state by saving local variables. Each time you call next(), it resumes from where it last yielded. Think of it as a bookmark in your function. Let's take a look at an example I wrote.
So, if I call next() after the last yield, what happens?
That will raise a StopIteration exception. This is an important part of using generators because it tells you that there are no more values to yield. In summary, using yield simplifies creating iterators and conserves memory!
Unlock the classroom podcast
The transcript is above and free to read. A free account plays the conversation back.
Create a free accountNow, let's talk about yield from. Can anyone share their thoughts on why we would need it?
It seems like it could simplify nested loops or multiple yields?
Absolutely correct! yield from allows you to delegate part of a generator’s work to another generator, making your code cleaner. Here’s an example:
In this code, yield from allows generator1 to yield values from a list and a generator expression. It saves us from having to write additional loops.
So we can use it with both lists and other generators?
Yes! That flexibility is one of yield from's strengths. It helps keep your code DRY—don't repeat yourself. Can anyone tell me how that might improve maintenance?
If it's shorter and clearer, future updates should be easier!
Exactly! By using yield from, we build more maintainable code that’s easier to understand.
Overview
Short Summary
This section introduces the yield and yield from keywords, explaining their functionality in managing generator behavior in Python.
Medium Summary
In this section, we explore how the yield keyword suspends function execution, allowing the generator to return a value and resume later. We also look at yield from, which simplifies the process of delegating part of a generator's operations to another iterable, making code cleaner and easier to understand.
Detailed Summary
Using yield and yield from
In this section of the chapter, we delve into two essential keywords in Python's generator functionality: yield and yield from.
yield
The keyword yield temporarily suspends the execution of a function, allowing it to return a value. This means that rather than terminating the function, it can be resumed later from the point it left off. An example illustrates this core functionality:
def simple_gen():
yield 1
yield 2
yield 3
gen = simple_gen()
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3In this example, each call to next(gen) resumes execution until the next yield statement. If you call next() again after the last yield, it will raise a StopIteration exception.
yield from
Introduced in Python 3.3, yield from allows a generator to delegate part of its operations to another generator or iterable. This can reduce the complexity of nested loops. Here’s an illustrative example:
def generator1():
yield from [1, 2, 3]
yield from (x*x for x in range(4))
for value in generator1():
print(value)This code produces a sequence of numbers from two different sources without explicitly looping through each one.
Together, yield and yield from elevate the flexibility and power of generator functions, helping to simplify code and enhance readability. Understanding these constructs is pivotal for writing clean and efficient Python code.
Audio Book
Unlock the audio lesson
The script is above and free to read. A free account plays it back, in the voice you pick.
Create a free accountyield
The yield keyword suspends the function, returning a value, and resumes later to continue.
def simple_gen():
yield 1
yield 2
yield 3
gen = simple_gen()
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3Detailed Explanation
The yield statement is used in a function to turn it into a generator. When the function is called, it does not execute. Instead, it produces a generator object. Each time next() is called on this object, the function runs until it hits a yield statement, at which point it returns the value specified after yield. After returning a value, the function's execution is paused, and its state is saved. When next() is called again, the function resumes right after the last yield statement.
Examples & Analogies
Think of yield like a chef who prepares a dish step-by-step. Each time the chef completes a step, they serve the dish for tasting (yield), but they remember where they left off. When the taster asks for another bite (next()), the chef resumes right from there, instead of starting over from scratch.
Unlock the audio lesson
The script is above and free to read. A free account plays it back, in the voice you pick.
Create a free accountyield from
Introduced in Python 3.3, yield from delegates part of a generator’s operations to another generator or iterable, simplifying nested loops.
def generator1():
yield from [1, 2, 3]
yield from (x*x for x in range(4))
for value in generator1():
print(value)Detailed Explanation
yield from is a powerful addition to generators that allows one generator to yield all values from another generator or iterable. Instead of writing loops to yield multiple values, yield from handles the iteration automatically. This makes the code cleaner and easier to read. In the example, generator1 yields values from a list and then yields the squares of numbers from another generator expression. It combines two sources of yielded data seamlessly.
Examples & Analogies
Imagine a relay race. Instead of each runner waiting for their turn to run a segment of the race, yield from allows a runner to pass the baton directly to the next runner who continues immediately without stopping. This keeps the race going smoothly and efficiently, similar to how yield from keeps generating values without additional loops.
--
Key Concepts
Examples
Memory Aids
Interactive tools to help you remember key concepts
Stories
Flash Cards
Glossary
yield
A keyword in Python that suspends the execution of a function, allowing it to return a value and resume later.
yield from
A keyword that delegates part of a generator’s operations to another generator or iterable, simplifying nested loops.
generator
A special type of iterator defined by a function that yields values one at a time.
StopIteration
An exception raised in Python when there are no more items from a generator.