Is there any reason to use Python's generator-based coroutines over async/await?
<p>Despite its well-known "one way to do it" philosophy, Python (as of version 3.5) supports two ways of writing coroutines:</p>

<ol>
<li><a href="https://www.python.org/dev/peps/pep-0342/" rel="nofollow">enhanced generators</a> (perhaps with <a href="https://www.python.org/dev/peps/pep-0380/" rel="nofollow"><code>yield from</code></a>)</li>
<li><a href="https://www.python.org/dev/peps/pep-0492/" rel="nofollow"><code>async</code> and <code>await</code></a>.</li>
</ol>

<p>Assume we only need to support versions of Python >= 3.5. Is it ever necessary to use the older, generator-based coroutines? Or do <code>async</code>/<code>await</code>-based coroutines completely replace generator-based ones?</p>

<p>Quoting <a href="https://mail.python.org/pipermail/python-dev/2015-April/139728.html" rel="nofollow">Guido van Rossum himself</a>:</p>

<blockquote>
  <p>[...] eventually we'll always be using async functions when coroutines are called for, dedicating generators once again to their pre-PEP-342 role of a particularly efficient way to implement iterators.</p>
</blockquote>

python asynchronous async-await generator coroutine