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

AltStyle によって変換されたページ (->オリジナル) /