[PEP202 listcomps] (was RE: [Python-Dev] List comprehension syntax (Features for Python 2.0))

Tim Peters tim_one@email.msn.com
Tue, 25 Jul 2000 18:08:47 -0400

[MAL, on /F's complaints about
    [for x in range(100): x*2]
> ...
> IMHO, the meaning of the differen parts is intuitively
> understandable from the fact that Python's standard "for"
> notation works in the same way.
> OTOH, the notation "x*2 for x in range(100)" looks strange to me
> and probably to others too, because it doesn't make clear what "x"
> really refers to until you read on... this is Python not Forth or
> Haskell !

The feature is taken from Haskell, which in turn adapted it from SETL.  Both
follow the long-established ordering of mathematical set-builder notation,
where the *expression* is leftmost.  It's the expression that's important,
not the incidental details of the iterators -- there's more than a century
of user experience behind that <0.6 wink>.

I'll note that everything "looks strange" the first time you see it.  It's
more important that it feels right after you grasp it.  That's the case
here!  When I see

    [x**2 for x in range(100)]

I (being a left-to-right reader) immediately grasp "ah, it's a list of
squares".  Write it

    [for x in range(100): x*2]

and it's simply harder to grasp (indeed, *that* "looks strange" to me -- it
looks like somebody started to write a "for" loop and made a typo).

In any case, this particular point was debated to death more than a year
ago, and Guido already Pronounced on it.

> ...
> Note that we could also extend the above by allowing multiple
> such constructs separated by commas:
> data = (1.3, 1.2, 1.1)
> l = [for x in data: 3*x,
>      for x in data: x/10]

Sure, and we could write


for Unicode lists too <wink>.  I see no advantage in the above over the
simpler construct, i.e.

   l = [3*x for x in data] + [x/10 for x in data]

except that it may be easier for a dirt-dumb implementation to optimize the