Guido van Rossum, in his speech in 2014 on Tulip/Asyncio shows the slide:
Tasks vs coroutines
Compare:
As described in PEP 380, the accepted PEP document that introduced yield from, the expression res = yield from f() comes from the idea of the following loop:
for res in f():
yield res
With this, things become very clear: if f() is some_coroutine(), then the coroutine is executed. On the other hand, if f() is Task(some_coroutine()), Task.__init__ is executed instead. some_coroutine() is not executed, only the newly created generator is passed as the first argument to Task.__init__.
Conclusion:
res = yield from some_coroutine() => coroutine continues execution and returns the next valueres = yield from Task(some_coroutine()) => a new task is created, which stores a non-executed some_coroutine() generator object.