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