
On Fri, May 11, 2018 at 9:15 PM, Nick Coghlan <ncoghlan@gmail.com> wrote:
* *maybe* discover that even the above expansion isn't quite accurate, and that the underlying semantic equivalent is actually this (one way to discover this by accident is to have a name error in the outermost iterable expression):
def _genexp(_outermost_iter): for x in _outermost_iter: yield x
_result = _genexp(_outermost_iter)
* and then realise that the optimised list comprehension form is essentially this:
def _listcomp(_outermost_iter): result = [] for x in _outermost_iter: result.append(x) return result
_result = _listcomp(data)
Now that "yield" in comprehensions has been prohibited, you've learned all the edge cases at that point
Not quite! You missed one, just because comprehensions aren't weird enough yet. AFAIK you can't tell with the list comp, but with the genexp you can (by not iterating over it).
def _genexp(_outermost_iter): for x in _outermost_iter: yield x
_result = _genexp(data)
It's actually this: def _genexp(_outermost_iter): for x in _outermost_iter: yield x _result = _genexp(iter(_outermost_iter)) I don't think there's anything in the main documentation that actually says this, although PEP 289 mentions it in the detaily bits. [1] ChrisA [1] https://www.python.org/dev/peps/pep-0289/#the-details