Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Is this a good use for lambda

Reply
Thread Tools

Is this a good use for lambda

 
 
Charlie Taylor
Guest
Posts: n/a
 
      12-17-2004

I find that I use lambda functions mainly for callbacks to things like
integration or root finding routines as follows.

flow = integrate(lambda x: 2.0*pi * d(x)* v(x) * sin(a(x)),xBeg, xEnd)

root = findRoot(xBeg, xEnd,
lambda x: y2+ lp*(x-x2) -wallFunc( x )[0], tolerance=1.0E-15)

I have tried using named functions instead of using lambda functions,
however, I always end up with a convoluted, hard to follow mess.

Is there a better solution than a lambda in the above situations?

 
Reply With Quote
 
 
 
 
Harlin Seritt
Guest
Posts: n/a
 
      12-18-2004
Charlie Taylor wrote:

>
> I find that I use lambda functions mainly for callbacks to things like
> integration or root finding routines as follows.
>
> flow = integrate(lambda x: 2.0*pi * d(x)* v(x) * sin(a(x)),xBeg, xEnd)
>
> root = findRoot(xBeg, xEnd,
> lambda x: y2+ lp*(x-x2) -wallFunc( x )[0], tolerance=1.0E-15)
>
> I have tried using named functions instead of using lambda functions,
> however, I always end up with a convoluted, hard to follow mess.
>
> Is there a better solution than a lambda in the above situations?


Yes. Write a separate function for it. It may actually take less time and be
a good deal more readable. Also, you'll be able to call this mess again if
you need to.

--
Harlin Seritt
 
Reply With Quote
 
 
 
 
Steven Bethard
Guest
Posts: n/a
 
      12-18-2004
Harlin Seritt wrote:
> Charlie Taylor wrote:
>
>
>>I find that I use lambda functions mainly for callbacks to things like
>>integration or root finding routines as follows.
>>
>>flow = integrate(lambda x: 2.0*pi * d(x)* v(x) * sin(a(x)),xBeg, xEnd)
>>
>>root = findRoot(xBeg, xEnd,
>> lambda x: y2+ lp*(x-x2) -wallFunc( x )[0], tolerance=1.0E-15)
>>
>>I have tried using named functions instead of using lambda functions,
>>however, I always end up with a convoluted, hard to follow mess.
>>
>>Is there a better solution than a lambda in the above situations?

>
>
> Yes. Write a separate function for it. It may actually take less time and be
> a good deal more readable. Also, you'll be able to call this mess again if
> you need to.


Well, I think the jury could still be out on which version is more
readable, but I don't understand the comment "I have tried using named
functions instead of using lambda functions, however, I always end up
with a convoluted, hard to follow mess." If you know that:

<name> = lambda *args, **kwds: <expr>

is eqivalent to:

def <name>(*args, **kwds):
return <expr>

then it's quite straightforward to translate from one to the other. As
an illustration, here are your functions translated from lambdas to defs:

def flowfunc(x):
return 2.0*pi * d(x)* v(x) * sin(a(x))
flow = integrate(flowfunc, xBeg, xEnd)

def rootfunc(x):
return y2 + lp*(x - x2) - wallFunc(x)[0]
root = findRoot(xBeg, xEnd, rootfunc, tolerance=1.0E-15)

I'm not necessarily suggesting that this is the right answer for your
situation, just that the translation from lambda to def should be
relatively simple if you decide that that's what you want to do.

Steve
 
Reply With Quote
 
Jeff Shannon
Guest
Posts: n/a
 
      12-18-2004
Charlie Taylor wrote:

>root = findRoot(xBeg, xEnd,
> lambda x: y2+ lp*(x-x2) -wallFunc( x )[0], tolerance=1.0E-15)
>
>


Um, so which parts of this are the actual lambda?? Just from reading
that, it's hard to be sure. My mind keeps wanting to break at 'lambda
x: y2 + lp*(x-x2)', but when I stop to think about it, I know that it
must be the entire segment between commas ('lambda x: y2 + lp*(x-x2)
-wallFunc( x )[0]').

This is exactly why I don't like using lambdas. Very easy to get
confused by the syntax, and (IMO) not much benefit.

>I have tried using named functions instead of using lambda functions,
>however, I always end up with a convoluted, hard to follow mess.
>
>


See, to my mind, the above is a bit convoluted and hard to follow. I'd
prefer to see something like:

def func(x):
answer = y2 + (lp * (x-x2)) - wallFunc(x)[0]
return answer

root = findRoot(xBeg, xEnd, func, tolerance=1.0E-15)

(I'm hoping, of course, that y2, x2, and lp are local variables, rather
than global variables...)

I find this named function to be much more clear in regards to what's
part of the lambda and what's actually a parameter to findRoot(). I
suppose that opinions may vary, however.

Jeff Shannon
Technician/Programmer
Credit International

 
Reply With Quote
 
Michael Hoffman
Guest
Posts: n/a
 
      12-18-2004
Charlie Taylor wrote:

> flow = integrate(lambda x: 2.0*pi * d(x)* v(x) * sin(a(x)),xBeg, xEnd)


def _flow_func(x):
return 2.0 * pi * d(x) * v(x) * sin(a(x))
flow = integrate(_flow_func, xBeg, xEnd)

> root = findRoot(xBeg, xEnd,
> lambda x: y2+ lp*(x-x2) -wallFunc( x )[0], tolerance=1.0E-15)


def _root_func(x):
return y2 + lp*(x - x2) - wallFunc(x)[0]
root = findRoot(xBeg, xEnd, _root_func, tolerance=1.0e-15)

I think those are much easier to follow. I find consistent punctuation
spacing helps readability too...
--
Michael Hoffman
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Type of lambda function returning a lambda function... Haochen Xie C++ 4 03-17-2013 11:23 PM
lambda vs non-lambda proc Steve Dogers Ruby 1 03-30-2009 10:11 PM
Re: Lambda as declarative idiom (was RE: what is lambda used for inreal code?) Roman Suzi Python 13 01-07-2005 09:33 PM
Re: Is this a good use for lambda Fredrik Lundh Python 24 12-23-2004 12:15 AM
Finally found a use for lambda! Roy Smith Python 9 09-16-2003 05:16 AM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57