As introduced at the beginning of this chapter, the iteration is a mechanism that calls next() on an iterable object many times until a StopIteration exception is raised.
So far, we have been exploring the iterative nature of generators—we produce values one at a time, and, in general, we only care about each value as it's being produced at every step of the for loop. This is a very logical way of thinking about generators, but coroutines have a different idea; even though they are technically generators, they weren't conceived with the idea of iteration in mind, but with the goal of suspending the execution of a code until it's resumed later on.
This is an interesting challenge; when we design a coroutine, ...