Support for coroutines in Lua is provided by functions in the coroutine table, primarily create, resume and yield. The developers describe these coroutines as stackful, first-class and asymmetric.
Coroutines are also available in Python, either using enhanced generators (and yield from) or, added in version 3.5, async and await.
How do coroutines in Python compare to those in Lua? Are they also stackful, first-class and asymmetric?
Why does Python require so many constructs (async def, async with, async for, asynchronous comprehensions, ...) for coroutines, while Lua can provide them with just three built-in functions?