[Tutor] map() and lambda to change class instance attribute

Bernard Lebel 3dbernard at gmail.com
Wed May 11 21:17:38 CEST 2005


Hi Danny,

Thanks a lot for the advice. I will put that in practice.


The blasphemous example is on page 227 of the second edition, under
Mapping Functions Over Sequences.


Cheers
Bernard


On 5/11/05, Danny Yoo <dyoo at hkn.eecs.berkeley.edu> wrote:
> 
> > I have to confess that I already use map(), or should I say abuse, for
> > this, although it is the first time I consider using lambdas. Up until
> > now I always used map() to perform a looped call on a function that
> > would change the attribute value, as shown in Mark Lutz & David Ascher's
> > Learning Python:
> >
> > # Perform attribute value change on a single instance
> > def iterateInstances( oInstance ):
> >       oInstance.value = myValue
> >
> > # Loop over list of instances
> > map( iterateInstances, aListOfInstances )
> 
> What!!!  Seriously?  I'm making a style judgement here, so perhaps I could
> be wrong, but I think that's terrible that Learning Python has such an
> example.  If you have a page number, I'll look it up and then write a
> complaint.  *grin*
> 
> The major problem here is that both map() and list comprehensions are
> really meant to be used because they generate a list of return values.
> 
> If we use a map() or list comprehensions, such as:
> 
>      map(lambda x: x^2, [1, 2, 3])
> 
>      [x^2 for x in [1, 2, 3]]
> 
> then we're really saying something like this:
> 
>      [1,     2,     3]
>       |      |      |
>       |      |      |  map()
>       |      |      |
>       V      V      V
>      [1,     4,     9]
> 
> where map() produces a list of values.
> 
> If we're using map() just because it evaluates something on every element
> on a list, then, to make the intent more clear, we really should either
> use something like a foreach() function instead of map():
> 
> ######
> def foreach(function, l):
>     """Apply some function on every element in l.  Does not accumulate
>     return values."""
>     for x in l:
>         function(l)
> ######
> 
> If we use something like foreach(0, then this makes it clear that we
> really don't care about return values at all.
> 
> I should add that I'm arguing for style here.  Things do work pefectly
> well with map() too --- the computer doesn't care that it's throwing
> return values away --- but we should do our best to document intent in our
> programs.
> 
> Best of wishes!
> 
>


More information about the Tutor mailing list