What does a list comprehension do

Jussi Piitulainen harvest at is.invalid
Thu Nov 26 11:11:57 EST 2015


Antoon Pardon writes:
> Op 26-11-15 om 14:56 schreef Marko Rauhamaa:
>> Antoon Pardon wrote:
>>
>>> I don't understand. What I propose would be a minor change in how
>>> list comprehension works. I don't see how your example can be turned
>>> into a list comprehension.
>>
>> The list comprehension is only a special case of the interaction
>> between closures and variables. If you dabble with list
>> comprehensions and lambdas, you'll need to make consistent changes in
>> closure semantics.
>
> It would only dabble with the list comprehension not with the lambda.
> The effect of the change would only be that a list comprehension like
>
>     [ <expression> for <var> in <iter> ]
>
> would implicitly be rewritten as follows:
>
>     [ (lambda <var>: <expression>)(<var>) for <var> in <iter>]
>
> There would no change on how lambdas work or functions or closures.
>
>> BTW, all(!?) other languages from Java to Scheme share closure semantics
>> with Python so you would really be making a mess by changing Python.
>
> Not this proposal, which wouldn't touch closure semantics.

It needs to take into account the possibility of more than one variable,
but that's a minor adjustment. I like it. It's simple enough.

The following code exercises different values from nested comprehension
loops, together with a shared global whose value actually changes before
each call to one of the listed thunks.

m = "good morning to you"

thoughts = [ (lambda n, u :
                  ((lambda : (u//2)*m),
                   (lambda : n)))
             (n, u)
             for n in range(10)
             if n % 2            # odd?
             for u in range(10)
             if u % 2 - 1        # less odd?
             if n < u  ]

for t, g in zip(thoughts, ((["hello"], ["eiku"], ["hej"]) +
                           tuple(20 * "."))):
    m = g
    message, number = t
    print(number(), *message())

# Prints:
1 hello
1 eiku eiku
1 hej hej hej
1 . . . .
3 . .
3 . . .
3 . . . .
5 . . .
5 . . . .
7 . . . .



More information about the Python-list mailing list