On Sat, Mar 28, 2015 at 6:25 PM, Jim Mooney <[email protected]> wrote:
> Shouldn't this give me a list of squares?
> [lambda x: x**2 for x in range(10)]
>
> Instead I'm getting ten of these (with different addresses)
> <function <listcomp>.<lambda> at 0x01262A50>]
Mark Lawrence's answer shows how to correct this.
Let's look at the problem a little more closely. To do so, one thing
we can do is rewrite to try removing the use of lambdas. Here's a
fairly similar situation to what you had:
######################
def square(x):
return x * x
[square for x in range(10)]
######################
If you saw that last expression, you might notice a mistake: we
haven't called the function on an argument!
We wanted to say:
[square(x) for x in range(10)]
Once we understand this, let's go back to your original expression:
[lambda x: x**2 for x in range(10)]
If we wanted to revise this so that it applied the function, we can do that:
[(lambda x: x**2)(x) for x in range(10)]
If you're a functional programmer, Python's list comprehension syntax
will take a slight re-adjustment. List comprehensions do sort-of the
same sort of thing as a functional map, but since it's built-in
syntax, it does a bit more, in that the "mapper" is an expression that
directly involves the mapped values.
_______________________________________________
Tutor maillist - [email protected]
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor