Python lamda

来源:互联网 发布:武汉软件新城派出所 编辑:程序博客网 时间:2024/06/05 00:57

Why are Python lambdas useful? [closed]

up vote449down votefavorite
253

I'm trying to figure out python lambdas. Is lambda one of those 'interesting' language items that in real life should be forgotten? 

I'm sure there are some edge cases where it might be needed, but given the obscurity of it, the potential of it being redefined in future releases (my assumption based on the various definitions of it) and the reduced coding clarity - should it be avoided? 

This reminds me of overflowing (buffer overflow) of C types - pointing to the top variable and overloading to set the other field values. It feels like sort of a techie showmanship but maintenance coder nightmare.

shareimprove this question

closed as too broad by meagar Nov 14 '15 at 16:59

There are either too many possible answers, or good answers would be too long for this format. Please add details to narrow the answer set or to isolate an issue that can be answered in a few paragraphs.If this question can be reworded to fit the rules in the help center, please edit the question.

 
96 
Well, I don't think you'd like JavaScript much then ... and good Lord, stay away from Haskell! – JAL Jan 16 '10 at 15:43
164 
+1 Good question - bad assumptions (obscurity of lambda) =) Try not to be judgmental of programming techniques. Evaluate them, and add them to your mental toolkit. If you don't like them, don't use them, and be prepared to discuss them logically without becoming religious. – Kieveli Feb 23 '10 at 13:27
25 
Haskell Rules! Lambda functions gives you expressivity and abstraction power. – Jonathan Barbero Feb 23 '10 at 13:31
1 
@JAL Not to mention LISP... – ApproachingDarknessFish Feb 24 '14 at 0:41

26 Answers

activeoldestvotes
up vote520down voteaccepted

Are you talking about lambda functions? Like

f = lambda x: x**2 + 2*x - 5

Those things are actually quite useful. Python supports a style of programming called functional programming where you can pass functions to other functions to do stuff. Example:

mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])

sets mult3 to [3, 6, 9], those elements of the original list that are multiples of 3. This is shorter (and, one could argue, clearer) than

def filterfunc(x):    return x % 3 == 0mult3 = filter(filterfunc, [1, 2, 3, 4, 5, 6, 7, 8, 9])

Of course, in this particular case, you could do the same thing as a list comprehension:

mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]

(or even as range(3,10,3)) but there are other cases, like constructing functions as return values from other functions, where you can't use a list comprehension and a lambda function may be the shortest way to write something out. Like

def transform(n):    return lambda x: x + nf = transform(3)f(4) # is 7

I use lambda functions on a regular basis. It took a while to get used to them but once I did I'm glad Python has them ;-)

shareimprove this answer
 
75 
lambda is one of the requisites for a readable functional language. it's a pity that Python's syntax makes them so limited. still, it's miles ahead of any language without it. – Javier May 20 '09 at 21:13
12 
@Xavier: I believe Javier is referring to verbosity of the lambda keyboard, and possibly the fact that you can only use expressions in Python lambdas. Contrast C#: x => ..., or Haskell: \x -> ... with Python lambda x: .... – Porges Jul 7 '10 at 1:18 
63 
@Porges: The verbosity is a minor problem. The fact thta you can only use a SINGLE expression (and no statements) is a far more serious problem. – JUST MY correct OPINION Jul 7 '10 at 1:37
6 
@orokusaki: in functional languages, lambda is the basic form of function definition, any funcion is in principle a lambda assigned to a variable. in Python syntax, the lambda form doesn't allow arbitrary functions, just a single expression. the main reason is so that it doesn't need an 'end' marker. – Javier Nov 5 '10 at 17:30
14 
Arbitrarily complex lambdas are a great way to produce disgusting blobs of code golf code, but terrible in reality. Even in functional languages I've found I gravitate towards naming things wherever I can to avoid my code becoming an unreadable mess. Lambdas stop you reusing code, and they cram a lot into a single line. Yes, in simple cases, they are useful, but then a single expression is almost all you ever need. Python provides syntactic sugar for a lot of the cases you'd want them anyway. In more complex case, just define a named function and use it. – Latty Nov 18 '14 at 23:35
up vote116down vote

lambda is just a fancy way of saying function. Other than its name, there is nothing obscure, intimidating or cryptic about it. When you read the following line, replace lambda by function in your mind:

>>> f = lambda x: x + 1>>> f(3)4

It just defines a function of x. Some other languages, like R, say it explicitly:

> f = function(x) { x + 1 }> f(3)4

You see? It's one of the most natural things to do in programming. 

shareimprove this answer
 
3 
This is a great description for those coming from non-programming backgrounds (ie: exact sciences) which makes the meaning of lambda very simple to understand. Thanks! – Gabriel Jan 2 at 15:24
up vote63down vote

A lambda is part of a very important abstraction mechanism which deals with higher order functions. To get proper understanding of its value, please watch high quality lessons from Abelson and Sussman, and read the book SICP

These are relevant issues in modern software business, and becoming ever more popular.

shareimprove this answer
 
44 
+1 for SICP. Everyone should read that book. If it doesn't kill you it WILL make you stronger. – Trey May 20 '09 at 20:59
1 
Lambda expressions are becoming popular in other languages (like C#) as well. They're not going anywhere. Reading up on closures would be a useful exercise to understand Lambdas. Closures make a lot of coding magic possible in frameworks like jQuery. – Dan Esparza May 20 '09 at 21:36
6 
This post does not contain an answer. It would fit better as a comment. – joar Nov 11 '11 at 14:05
23 
If you need to read a book everytime you ask a question on SO, it's going to get ugly. – e-satis Aug 21 '12 at 6:50
16 
read SICP to understand python lambda? uff.. – Daniel Magnusson Jan 10 '13 at 8:50
up vote60down vote

The two-line summary:

  1. Closures: Very useful. Learn them, use them, love them.
  2. Python's lambda keyword: unnecessary, occasionally useful. If you find yourself doing anything remotely complex with it, put it away and define a real function.
shareimprove this answer
 
 
I feel this is the correct answer. – ostler.c Nov 17 '15 at 23:28
up vote42down vote

I doubt lambda will go away. See Guido's post about finally giving up trying to remove it. Also see an outline of the conflict.

You might check out this post for more of a history about the deal behind Python's functional features: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

Curiously, the map, filter, and reduce functions that originally motivated the introduction of lambda and other functional features have to a large extent been superseded by list comprehensions and generator expressions. In fact, the reduce function was removed from list of builtin functions in Python 3.0. (However, it's not necessary to send in complaints about the removal of lambda, map or filter: they are staying. :-)

My own two cents: Rarely is lambda worth it as far as clarity goes. Generally there is a more clear solution that doesn't include lambda.

shareimprove this answer
 
2 
note that reduce is still importable in Python 3.0. If You REALLY want it, You can still have it. – Reef May 20 '09 at 22:00
2 
+1 for the link to Guido's admittance of defeat. It's nice to see so many posters agreeing with lambda! – new123456 Jun 15 '11 at 17:44
 
I think Guido's attempt was more about the syntax. This person also thinks that: cackhanded.com/blog/post/2008/01/24/… – leewangzhong Jul 30 '14 at 23:45
up vote33down vote

lambdas are extremely useful in GUI programming. For example, lets say you're creating a group of buttons and you want to use a single paramaterized callback rather than a unique callback per button. Lambda lets you accomplish that with ease:

for value in ["one","two","three"]:    b = tk.Button(label=value, command=lambda arg=value: my_callback(arg))    b.pack()

The alternative is to create a separate callback for each button which can lead to duplicated code.

shareimprove this answer
 
 
This is exactly why I looked up what lambda was, but why does this work, to me it looks the exact same as just calling the function straight ( stackoverflow.com/questions/3704568/… ). Maybe it's late, it does work, but why does it work? – Rqomey Aug 5 '13 at 22:10
1 
@Rqomey: the difference is that in this example value is defined in a loop; in the other example the parameter always only had one value. When you add something like arg=value, you are attaching the current value to the callback. Without it, you bind a reference to the variable in the callback. The reference will always contain the final value of the variable, since the callback happens some time after the loop has already finished running. – Bryan Oakley Aug 6 '13 at 1:56
1 
I just got this working yesterday, I honestly can't believe how useful it is... I can build up a menu from one for loop and a csv file for configuration. Really useful stuff. – Rqomey Aug 7 '13 at 8:31 
1 
Note the existence of functools.partial() which allows you to do this with less cruft (and without lambda). – Latty Nov 18 '14 at 23:40
2 
partial(my_callback, value) vs lambda arg=value: my_callback(arg) - the lambda has much more cruft (assignment to arg and then usage) and it's less clear what the intention is (you could be doing something subtly different in the lambda). Imports are not really a problem (you have a pile anyway and it's once per file). Code is best judged on how well it reads, and partial() is much easier to read than the lambda. – Latty Nov 19 '14 at 10:12 
up vote21down vote

Pretty much anything you can do with lambda you can do better with either named functions or list and generator expressions.

Consequently, for the most part you should just one of those in basically any situation (except maybe for scratch code written in the interactive interpreter).

shareimprove this answer
 
3 
"for the most part you should just one of those in basically any situation" Period. Typing lambda's in the interpreter isn't even that helpful. – S.Lott May 20 '09 at 20:58
10 
@Javier I agree with you if you are talking about "lambda" the concept; however, if we're talking about "lambda" the python keyword then: 1) named functions are faster and can do more (statements+expressions) almost anywhere you would use lambdas (map+filter) you can just generator expressions or list comprehensions which are more performant and concise. I'm not saying that first class functions aren't cool, just that the "lambda" keyword in python isn't as good as just using a named function, that's all. – Aaron Maenpaa May 20 '09 at 22:05
3 
lambda has been indispensable to me for use with functions that take callback arguments like the key= argument to sort() and sorted() – Rick Copeland May 21 '09 at 15:57
12 
@Rick I don't doubt that, but the reality is if when you see "lambda" and you think "zohmygod lambda" and start writing scheme code in python you will surly be disappointing by the limitations of python's lambda expression. On the other hand, if you start out thinking to yourself "Will a list comprehension work? No. Will what I need benifit from being a named function? No. Okay fine: sorted(xs, key = lambda x: x.name, x.height)", you will probably end up using lambda the right number of times. – Aaron Maenpaa May 21 '09 at 17:02
3 
+1: I cannot stress that enough when one uses a lambda one uses an nameless function. And names do have a precious intellectual added value. – Stephane Rolland Nov 15 '12 at 12:38 
up vote18down vote

I find lambda useful for a list of functions that do the same, but for different circumstances. Like the mozilla plural rules.

plural_rules = [    lambda n: 'all',    lambda n: 'singular' if n == 1 else 'plural',    lambda n: 'singular' if 0 <= n <= 1 else 'plural',    ...]# Call plural rule #1 with argument 4 to find out which sentence form to use.plural_rule[1](4) # returns 'plural'

If you'd have to define a function for all of those you'd go mad by the end of it. Also it wouldn't be nice with function names like plural_rule_1, plural_rule_2, etc. And you'd need to eval() it when you're depending on a variable function id.

shareimprove this answer
 
 
This looks similar to the brief encounters that I've had so far in F# with pattern matching and options. Do you have more info about how to use this syntax? – Kenneth Posey Jun 8 '11 at 18:29
up vote14down vote

I've been using Python for a few years and I've never run in to a case where I've needed lambda. Really, as the tutorial states, it's just for syntactic sugar.

shareimprove this answer
 
5 
They are very useful when developing a GUI using python. Often, widgets need a reference to a function. If you need a widget to call a function and pass arguments, lambda is a very convenient way to do that. – Bryan Oakley Apr 24 '11 at 16:38
up vote12down vote

In Python, lambda is just a way of defining functions inline,

a = lambda x: x + 1print a(1)

and..

def a(x): return x + 1print a(1)

..are the exact same.

There is nothing you can do with lambda which you cannot do with a regular function - in Python functions are an object just like anything else, and lambdas simply define a function:

>>> a = lambda x: x + 1>>> type(a)<type 'function'>

I honestly think the lambda keyword is redundant in Python - I have never had the need to use them (or seen one used where a regular function, a list-comprehension or one of the many builtin functions could have been better used instead)

For a completely random example, from the article "Python’s lambda is broken!":

To see how lambda is broken, try generating a list of functions fs=[f0,...,f9] where fi(n)=i+n. First attempt:

fs = [(lambda n: i + n) for i in range(10)] fs3 13

I would argue, even if that did work, it's horribly and "unpythonic", the same functionality could be written in countless other ways, for example:

>>> n = 4>>> [i + n for i in range(10)][4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

Yes, it's not the same, but I have never seen a cause where generating a group of lambda functions in a list has been required.. It might make sense in other languages, but Python is not Haskell (or Lisp, or ...)

Please note that we can use lambda and still achieve the desired results in this way :

>>> fs = [(lambda n,i=i: i + n) for i in range(10)]>>> fs[3](4)7

Edit:

There are a few cases where lambda is useful, for example it's often convenient when connecting up signals in PyQt applications, like this:

w = PyQt4.QtGui.QLineEdit()w.textChanged.connect(lambda event: dothing())

Just doing w.textChanged.connect(dothing) would call the dothing method with an extra event argument and cause an error.. Using the lambda means we can tidily drop the argument without having to define a wrapping function

shareimprove this answer
 
 
your "lambda is broken" argument is broken, because of the python variable scoping rules work that way, period. You will be bitten the same way if you created a closure inside for-loop. – Antti Haapala Feb 27 '13 at 7:24
 
lambda is just python's way to provide the user with an "anonymous" function, like many other languages have (e.g., javascript). – Stefan Gruenwald Oct 31 '14 at 19:27
 
The lambda and function a's that you defined are not exactly same. :) They differ by __name__ field at least... – progo Nov 6 '14 at 7:55
 
It's works more than just an inline function. – kta Nov 28 '15 at 12:23
up vote11down vote

I can't speak to python's particular implementation of lambda, but in general lambda functions are really handy. They're a core technique (maybe even THE technique) of functional programming, and they're also very useuful in object-oriented programs. For certain types of problems, they're the best solution, so certainly shouldn't be forgotten!

I suggest you read up on closures and the map function (that links to python docs, but it exists in nearly every language that supports functional constructs) to see why it's useful.

shareimprove this answer
 
1 
That stuff can be done without lambdas. It's just a big hassle. – Brian May 20 '09 at 20:54
up vote10down vote

As stated above, the lambda operator in Python defines an anonymous function, and in Python functions are closures. It is important not to confuse the concept of closures with the operator lambda, which is merely syntactic methadone for them.

When I started in Python a few years ago, I used lambdas a lot, thinking they were cool, along with list comprehensions. However, I wrote and have to maintain a big website written in Python, with on the order of several thousand function points. I've learnt from experience that lambdas might be OK to prototype things with, but offer nothing over inline functions (named closures) except for saving a few key-stokes, or sometimes not.

Basically this boils down to several points:

  • it is easier to read software that is explicitly written using meaningful names. Anonymous closures by definition cannot have a meaningful name, as they have no name. This brevity seems, for some reason, to also infect lambda parameters, hence we often see examples like lambda x: x+1 
  • it is easier to reuse named closures, as they can be referred to by name more than once, when there is a name to refer to them by.
  • it is easier to debug code that is using named closures instead of lambdas, because the name will appear in tracebacks, and around the error.

That's enough reason to round them up and convert them to named closures. However, I hold two other grudges against anonymous closures.

The first grudge is simply that they are just another unnecessary keyword cluttering up the language.

The second grudge is deeper and on the paradigm level, i.e. I do not like that they promote a functional-programming style, because that style is less flexible than the message passing, object oriented or procedural styles, because the lambda calculus is not Turing-complete (luckily in Python, we can still break out of that restriction even inside a lambda). The reasons I feel lambdas promote this style are:

  • There is an implicit return, i.e. they seem like they 'should' be functions.

  • They are an alternative state-hiding mechanism to another, more explicit, more readable, more reusable and more general mechanism: methods.

I try hard to write lambda-free Python, and remove lambdas on sight. I think Python would be a slightly better language without lambdas, but that's just my opinion.

shareimprove this answer
 
1 
"...in Python functions are closures". That's not quite right, as I understand it. Closures are functions, but functions are not always closures. Function-> lambda x,y: x+y. Closure-> lambda x: lambda y: x+y – OatmanSep 14 '11 at 15:57 
4 
"because the lambda calculus is not Turing-complete" is plain wrong, untyped lambda calculus IS Turing complete, that is the reason why it is so significant. You can get recursion using the Y-combinator, Y = lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args))) – Antti HaapalaFeb 27 '13 at 7:50
 
Furthermore, if one goes to Wikipedia to read on Turing completeness, it says "A classic example is the lambda calculus." – Antti Haapala Feb 27 '13 at 7:56
4 
Good Lord, answer that claims lambda-calculus is not Turing-complete with 10 upvotes?! – Marcin Łoś Sep 10 '13 at 13:52
 
seriously - Not Turing complete - this answer needs a serious edit or retraction. – Tony Suffolk 66 Feb 16 '15 at 12:11
up vote9down vote

Lambdas are actually very powerful constructs that stem from ideas in functional programming, and it is something that by no means will be easily revised, redefined or removed in the near future of Python. They help you write code that is more powerful as it allows you to pass functions as parameters, thus the idea of functions as first-class citizens.

Lambdas do tend to get confusing, but once a solid understanding is obtained, you can write clean elegant code like this:

squared = map(lambda x: x*x, [1, 2, 3, 4, 5])

The above line of code returns a list of the squares of the numbers in the list. Ofcourse, you could also do it like:

def square(x):    return x*xsquared = map(square, [1, 2, 3, 4, 5])

It is obvious the former code is shorter, and this is especially true if you intend to use the map function (or any similar function that takes a function as a parameter) in only one place. This also makes the code more intuitive and elegant. 

Also, as @David Zaslavsky mentioned in his answer, list comprehensions are not always the way to go especially if your list has to get values from some obscure mathematical way.

From a more practical standpoint, one of the biggest advantages of lambdas for me recently has been in GUI and event-driven programming. If you take a look at callbacks in Tkinter, all they take as arguments are the event that triggered them. E.g.

def define_bindings(widget):    widget.bind("<Button-1>", do-something-cool)def do-something-cool(event):    #Your code to execute on the event trigger

Now what if you had some arguments to pass? Something as simple as passing 2 arguments to store the coordinates of a mouse-click. You can easily do it like this:

def main():    # define widgets and other imp stuff    x, y = None, None    widget.bind("<Button-1>", lambda event: do-something-cool(x, y))def do-something-cool(event, x, y):    x = event.x    y = event.y    #Do other cool stuff

Now you can argue that this can be done using global variables, but do you really want to bang your head worrying about memory management and leakage especially if the global variable will just be used in one particular place? That would be just poor programming style.

In short, lambdas are awesome and should never be underestimated. Python lambdas are not the same as LISP lambdas though (which are more powerful), but you can really do a lot of magical stuff with them. 

shareimprove this answer
 
 
Thanks. I completely didn't understand your last example. How come x and y are defined in both main and do_something_cool? What happens to x and y in the function? The values passed seem to be immediately overwritten? How does the function know about event? Could you add some comments / explanation? Thanks – Sanjay Manohar Apr 9 '15 at 21:03 
 
@SanjayManohar I am passing x and y as arguments to do-something-cool and their values are being set in the function to illustrate how you can use lambdas to pass arguments where none are expected. The widget.bind function expects a event parameter which identifies the GUI event on that particular widget. I recommend reading on Tkinter's programming model for greater clarity. – varagrawal Apr 10 '15 at 5:08
 
hmm I think I understand the Tkinter model. But still don't quite understand -- you pass x,y then do x=event.x. Doesn't that overwrite the value you passed? And how does the function know what eventis? I don't see where you pass that to the function. Or is it a method? Also are you allowed minus signs in a function name? – Sanjay Manohar Apr 10 '15 at 18:37 
 
@SanjayManohar buddy you need to read up on Tkinter and Python. Tkinter passes the event object the function as a default action. As for the x, y, that is just an example for illustrative purposes. I am trying to show the power of lambdas, not Tkinter. :) – varagrawal Apr 15 '15 at 14:48
 
OK now I see what you intended - you want the function to receive event? in that case, shouldn't your lambda read lambda event: do_something_cool(event,x,y) ? – Sanjay Manohar Apr 16 '15 at 21:57
up vote7down vote

Lambda function it's a non-bureaucratic way to create a function.

That's it. For example, let's supose you have your main function and need to square values. Let's see the traditional way and the lambda way to do this:

Traditional way:

def main():......y = square(some_number)...return somethingdef square(x):    return x**2

The lambda way:

def main():...square = lambda x: x**2y = square(some_number)return something

See the difference?

Lambda functions go very well with lists, like lists comprehensions or map. In fact, list comprehension it's a "pythonic" way to express yourself using lambda. Ex:

>>>a = [1,2,3,4]>>>[x**2 for x in a][1,4,9,16]

Let's see what each elements of the syntax means:

[] : "Give me a list"

x**2 : "using this new-born function"

for x in a: "into each element in a"

That's convenient uh? Creating functions like this. Let's rewrite it using lambda:

>>> square = lambda x: x**2>>> [square(s) for x in a][1,4,9,16]

Now let's use map, which is the same thing, but more language-neutral. Maps takes 2 arguments: 

(i) one function

(ii) an iterable

And gives you a list where each element it's the function applied to each element of the iterable.

So, using map we would have:

>>> a = [1,2,3,4]>>> squared_list = map(lambda x: x**2, a)

If you master lambdas and mapping, you will have a great power to manipulate data and in a concise way. Lambda functions are neither obscure nor take away code clarity. Don't confuse something hard with something new. Once you start using them, you will find it very clear.

shareimprove this answer
 
up vote7down vote

One of the nice things about lambda that's in my opinion understated is that it's way of deferring an evaluation for simple forms till the value is needed. Let me explain. 

Many library routines are implemented so that they allow certain parameters to be callables (of whom lambda is one). The idea is that the actual value will be computed only at the time when it's going to be used (rather that when it's called). An (contrived) example might help to illustrate the point. Suppose you have a routine which which was going to do log a given timestamp. You want the routine to use the current time minus 30 minutes. You'd call it like so

log_timestamp(datetime.datetime.now() - datetime.timedelta(minutes = 30))

Now suppose the actual function is going to be called only when a certain event occurs and you want the timestamp to be computed only at that time. You can do this like so

log_timestamp(lambda : datetime.datetime.now() - datetime.timedelta(minutes = 30))

Assuming the log_timestamp can handle callables like this, it will evaluate this when it needs it and you'll get the timestamp at that time. 

There are of course alternate ways to do this (using the operator module for example) but I hope I've conveyed the point. 

Update: Here is a slightly more concrete real world example. 

Update 2: I think this is an example of what is called a thunk.

shareimprove this answer
 
up vote5down vote

Lambdas are deeply liked to functional programming style in general. The idea that you can solve problems by applying a function to a data, and merging the results, is what google uses to implement most of its algorithms. Programs written in functional rpogramming style, are easily parrallelized and hence are becoming more and more important with modern multiu core machiines. So in short, NO you should not forget them.

shareimprove this answer
 
up vote5down vote

First congrats that managed to figure out lambda. In my opinion this is really powerful construct to act with. The trend these days towards functional programming languages is surely an indicator that it neither should be avoided nor it will be redefined in the near future.

You just have to think a little bit different. I'm sure soon you will love it. But be careful if you deal only with python. Because the lambda is not a real closure, it is "broken" somehow: pythons lambda is broken

shareimprove this answer
 
 
Python's lambda is not broken. There are two ways to handle locals in lambdas. Both have advantages and disadvantages. I think the approach Python (and C#) took is probably counterintuitive to those more accustomed to purely functional languages, since with a purely functional language I don't think that approach even makes sense. – Brian May 20 '09 at 20:54
 
It is indeed counterintuitive. I'm not a python programmer but in squeak smalltalk it is the same and I stumple upon this regularly. So even I would consider it "broken" :) – Norbert Hartl May 20 '09 at 21:02
 
No, this has nothing to do with counterintuitivity. It is just that the lexical scope of variable names is that of a function; a loop does not introduce a lexical scope. Functions also work the same way in Javascript. If you need a scope for var, you can always do (lambda scopedvar: lambda x: scopedvar + x)() – Antti Haapala Feb 27 '13 at 7:26 
up vote4down vote

I'm just beginning Python and ran head first into Lambda- which took me a while to figure out.

Note that this isn't a condemnation of anything. Everybody has a different set of things that don't come easily.

Is lambda one of those 'interesting' language items that in real life should be forgotten?

No.

I'm sure there are some edge cases where it might be needed, but given the obscurity of it,

It's not obscure. The past 2 teams I've worked on, everybody used this feature all the time.

the potential of it being redefined in future releases (my assumption based on the various definitions of it)

I've seen no serious proposals to redefine it in Python, beyond fixing the closure semantics a few years ago.

and the reduced coding clarity - should it be avoided?

It's not less clear, if you're using it right. On the contrary, having more language constructs available increases clarity.

This reminds me of overflowing (buffer overflow) of C types - pointing to the top variable and overloading to set the other field values...sort of a techie showmanship but maintenance coder nightmare..

Lambda is like buffer overflow? Wow. I can't imagine how you're using lambda if you think it's a "maintenance nightmare".

shareimprove this answer
 
5 
-1 for making me (and others) read the whole question again. Note that others managed to answer without doing it. – Reef May 20 '09 at 22:03
up vote4down vote

I started reading David Mertz's book today 'Text Processing in Python.' While he has a fairly terse description of Lambda's the examples in the first chapter combined with the explanation in Appendix A made them jump off the page for me (finally) and all of a sudden I understood their value. That is not to say his explanation will work for you and I am still at the discovery stage so I will not attempt to add to these responses other than the following: I am new to Python I am new to OOP Lambdas were a struggle for me Now that I read Mertz, I think I get them and I see them as very useful as I think they allow a cleaner approach to programming. 

He reproduces the Zen of Python, one line of which is Simple is better than complex. As a non-OOP programmer reading code with lambdas (and until last week list comprehensions) I have thought-This is simple?. I finally realized today that actually these features make the code much more readable, and understandable than the alternative-which is invariably a loop of some sort. I also realized that like financial statements-Python was not designed for the novice user, rather it is designed for the user that wants to get educated. I can't believe how powerful this language is. When it dawned on me (finally) the purpose and value of lambdas I wanted to rip up about 30 programs and start over putting in lambdas where appropriate.

shareimprove this answer
 
up vote4down vote

I can give you an example where I actually needed lambda serious. I'm making a graphical program, where the use right clicks on a file and assigns it one of three options. It turns out that in Tkinter (the GUI interfacing program I'm writing this in), when someone presses a button, it can't be assigned to a command that takes in arguments. So if I chose one of the options and wanted the result of my choice to be:

print 'hi there'

Then no big deal. But what if I need my choice to have a particular detail. For example, if I choose choice A, it calls a function that takes in some argument that is dependent on the choice A, B or C, TKinter could not support this. Lamda was the only option to get around this actually...

shareimprove this answer
 
 
Well, presumably you could have done def foo... and then passed in foo instead of lambda. It's just more code and you have to come up with a name. – Jon Coombs Dec 2 '14 at 1:39
up vote4down vote

I'm a python beginner, so to getter a clear idea of lambda I compared it with a 'for' loop; in terms of efficiency. Here's the code (python 2.7) -

import timestart = time.time() # Measure the time taken for executiondef first():    squares = map(lambda x: x**2, range(10))    # ^ Lambda    end = time.time()    elapsed = end - start    print elapsed + ' seconds'    return elapsed # gives 0.0 secondsdef second():    lst = []    for i in range(10):        lst.append(i**2)    # ^ a 'for' loop    end = time.time()    elapsed = end - start    print elapsed + ' seconds'    return elapsed # gives 0.0019998550415 seconds.print abs(second() - first()) # Gives 0.0019998550415 seconds!(duh)
shareimprove this answer
 
5 
You may be interested in the timeit module, which typically gives more accurate results than subtracting time.time() values. – Kevin Feb 6 '14 at 19:15
1 
Hmm, don't you need to restart your timer at the start of first() and second()? – qneill May 14 '15 at 0:47
up vote3down vote

I use it quite often, mainly as a null object or to partially bind parameters to a function.

Here are examples:

to implement null object pattern:

{DATA_PACKET: self.handle_data_packetsNET_PACKET: self.handle_hardware_packets}.get(packet_type, lambda x : None)(payload)

for parameter binding:

let say that I have the following API

def dump_hex(file, var)    # some codepassclass X(object):    #...def packet_received(data):# some kind of preprocessingself.callback(data)    #...

Then, when I wan't to quickly dump the recieved data to a file I do that: 

dump_file = file('hex_dump.txt','w')X.callback = lambda (x): dump_hex(dump_file, x)...dump_file.close()
shareimprove this answer
 
up vote3down vote

A useful case for using lambdas is to improve the readability of long list comprehensions. In this example loop_dic is short for clarity but imagine loop_dic being very long. If you would just use a plain value that includes i instead of the lambda version of that value you would get a NameError.

>>> lis = [{"name": "Peter"}, {"name": "Josef"}]>>> loop_dic = lambda i: {"name": i["name"] + " Wallace" }>>> new_lis = [loop_dic(i) for i in lis]>>> new_lis[{'name': 'Peter Wallace'}, {'name': 'Josef Wallace'}]

Instead of 

>>> lis = [{"name": "Peter"}, {"name": "Josef"}]>>> new_lis = [{"name": i["name"] + " Wallace"} for i in lis]>>> new_lis[{'name': 'Peter Wallace'}, {'name': 'Josef Wallace'}]
shareimprove this answer
 
up vote3down vote

I use lambdas to avoid code duplication. It would make the function easily comprehensible Eg:

def a_func()  ...  if some_conditon:     ...     call_some_big_func(arg1, arg2, arg3, arg4...)  else     ...     call_some_big_func(arg1, arg2, arg3, arg4...)

I replace that with a temp lambda

def a_func()  ...  call_big_f = lambda args_that_change: call_some_big_func(arg1, arg2, arg3, args_that_change)  if some_conditon:     ...     call_big_f(argX)  else     ...     call_big_f(argY)
shareimprove this answer
 
up vote3down vote

I use lambda to create callbacks that include parameters. It's cleaner writing a lambda in one line than to write a method to perform the same functionality.

For example:

import imported.moduledef func():    return lambda: imported.module.method("foo", "bar")

as opposed to:

import imported.moduledef func():    def cb():        return imported.module.method("foo", "bar")    return cb
shareimprove this answer
 
up vote2down vote

Lambda is a procedure constructor. You can synthesize programs at run-time, although Python's lambda is not very powerful. Note that few people understand that kind of programming.

shareimprove this answer
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 想找回原来的k歌忘了密码怎么办 手机微信钱包支付密码忘了怎么办 微信支付账户被注销了怎么办 微信钱包密码忘了怎么办没绑银行卡 微信钱包密码忘了怎么办不用银行卡 企业网银密码输入三次错误怎么办 微信密码不知道手机也停用了怎么办 手机停用微信密码不记得了怎么办 农商银行登入密码忘记了怎么办 苹果手机忘记四位数解锁密码怎么办 银行卡用支付宝支付限额了怎么办 用银行卡号找回微信被盗密码怎么办 微信钱包密码错误被锁定怎么办 本人没玩财付通结果被扣了钱怎么办 我的银行卡给支付宝充不了钱怎么办 支付宝话费充错了怎么办啊 已充值成功送朋友话费不能送怎么办 微信绑定银行卡被盗刷q币怎么办 微信红包过了24小时没退回怎么办 微信6.67版本红包发错了怎么办 苹果6s还原后激活出错怎么办 q币充给了不存在的账号怎么办 怎么办微信的钱换成淘宝币 学信网密码密保手机号都忘了怎么办 第五人格玩游戏时总是闪退怎么办 qq安全中心密保手机换了怎么办 微信冻结账号绑定了银行卡怎么办 扣扣红包密码是支付密码忘了怎么办 红包退回通知不小心删除了怎么办 QQ炫舞金币充错账号怎么办 晋江的小说用晋江币买不了是怎么办 中国银行储蓄不能充值支付宝怎么办 微信怎么改银行卡密码忘记了怎么办 微信号手机号码换了密码忘了怎么办 微信被盗密码被改绑定手机号怎么办 微信qq号登陆改密码忘记了怎么办 本人微信红包赌博输了50万怎么办 4g飞享套餐话费用完了怎么办 手机丢了查话费欠了几百块怎么办 注销电信手机卡里面的余额怎么办 联通手机卡注销后里面的余额怎么办