Infinite streams, yield from and send
fake_model_stream stands in for a real model API that streams its answer. The consuming loop is the same shape as real client code.
A generator function uses yield to hand back values one at a time and freezes in place between them. It writes an iterator in a few lines, keeps its own state, and can produce infinite streams without using memory.
Change the code and press Run (Ctrl+Enter). Predict what will happen first, then break it on purpose and read what changes. Your edits are saved and match the lesson page.
Ready for more? This phase has 6 hands-on exercises with automatic checks.
Practice questions
Write the code in the editor, run it, then open the model answer to compare.
Write a generator squares(n) that yields the squares of 1 up to n. Print list(squares(5)).
Write a generator countdown(n) that yields n, n-1, ... down to 1, then the text "liftoff". Print each value on its own line with a for loop.
Write a generator chunks_of_text(text, size) that yields the text in pieces of at most size characters, then print the pieces for "streaming" with size 4.
Explain it without notes
What happens when you call a generator function, and when does its body actually run?
How does a generator keep its state between values, and how is that different from an iterator class?
What is yield from for, and what does it do that a loop with yield does not?
Why can a generator describe an infinite sequence, and how do you use one safely?
What do return, raise StopIteration, close() and throw() each do inside or to a generator?
Expected output
first 8 Fibonacci numbers: [0, 1, 1, 2, 3, 5, 8, 13]
received: 'Generators '
received: 'stream '
received: 'tokens '
received: '[DONE]'
5
15
closed