Python › Comprehensions & Generators

How does 'yield from' delegate iteration to a sub-generator, and what does it return as its own expression value?

Advanced

Answer

'yield from sub_generator' fully delegates yielding to the sub-generator, forwarding each of its values as if they were yielded directly by the outer generator — AND its expression evaluates to whatever the sub-generator eventually returns (via a 'return' statement), letting you compose generators while still capturing a final result.
def inner():
    yield 1
    yield 2
    return "inner done"

def outer():
    result = yield from inner()
    print(result)  # "inner done", printed after inner's values are yielded
    yield 3

list(outer())  # yields 1, 2, 3; prints "inner done" in between
Real-world example Composing a large generator out of smaller, reusable generator building blocks, similar to function composition.

Common follow-ups: How does 'yield from' also automatically forward .send() and .throw() calls into the delegated sub-generator?