On 3/24/14 4:49 AM, Steven D'Aprano wrote:
There's no doubt that lambda is less-often useful than is the def
statement. But not only is it still useful, but there is a continual
stream of people asking for Python to make it *more useful* by allowing
the body of a lambda to be a full block, not just a single statement.
Guido has stated (although I cannot remember where, so cannot paste a
link) that he accepts that in principle, so long as somebody comes up
with acceptable syntax.

Now, this will seem strange to you, but if lambda were expanded to include an entire block, well now, I would know two things:
  1) python has commitment to lambda    and
2) lambda would become WAY more useful... ie., the only way to have a "block expression" embedded in an expression ! I'd vote for that. But as someone else noted, inner functions work as well (now) and are really more readable, so ...

It's used in calendar, cgitb, configparser, difflib, decimal, functools,
inspect, os, pydoc and others. Python is a programming language aimed at
programmers, not a toy. It should include tools that programmers use,
like threads, closures, first-class functions. And lambda.

This is a valid point (its used a couple of hundred times). It could be replaced in probably of week of constant programming effort. Neither here nor there, because nobody at this point is demanding it.

Lambda is a problem of confusion for scientists and other
mathematicians (amateur and otherwise) {snip}
{snip}
But nor should the confusion of somebody
who doesn't know the language count for much.

This is the main disagreement between the two of us on this topic. It should count for TONS; whole metric TONs. Because someone who understands python primarily, and after five years of coding (say me) somebody tells (me) to use lambda in a key clause so that my sort will work, or work better, or work "their" way; and I have no idea why I need this nameless function (after I find out that "that" is what it is!) Its confusing, and please contrast between complicated. I don't mind complicated, or extensive, or even hard, but when something is needlessly confusing, then why?

Python's ints don't work exactly the same as ints do in some other
languages, nor do Python's strings, nor is Python's object model
precisely the same as that of some other languages. I think that it would
be a ridiculous idea to discard int, str and the entire object system
just because some people are surprised that Python doesn't behave exactly
like some other language. I don't think lambda is any different.

Your logic is faulty here. Conceptually python's lambda doesn't work as expected, from contexts that define lambda and where lambda in functional programming is VERY important. For one thing, why would we want to "spell out" the word "lambda". ( \x y -> x + y ) a b )
If we're going to use lambda, then use it.


Other languages -- not even Lisp -- don't get to be the sole decider as
to what counts as an anonymous function. Python's lambda may be limited,
but it is a perfectly fine lambda for what it is intended to do.

   Is that the same as George W. Bush's "decider" ?

I agree, and so does the link I referenced, for what it was designed to do, its powerful; esp if one needs to embed a function in an expression; that is what lambda is for.

Its also confusing to sophisticated users of all
stripes who may not be aware of "lambda" at all.

If they're not aware of lambda, how are they confused by it?

See above. They are recommended its use (maybe on this list) and they just don't get it; because its unnecessarily confusing.

No, not really. I don't understand who your intended audience for Python
is. If I were to try to guess, I suspect that you want to dumb Python
down until it is like Dartmouth BASIC circa 1980 except without the line
numbers and with a slightly different syntax. Perhaps I'm wrong, I
certainly hope I'm wrong, but that's the impression I got from your
comments on the python-ideas list.

Actually it was circa 1964. Actually, it was precisely 1964 (I was there).

No, I'm not advocating for dumb-down simplicity. Aristotle said that virtue is found at the mean. Either end of the spectrum is a problem (overly complicated, towards overly simplified) those end-points we must flee like the black plague. Normal people with reasonable training (college education) should be able to use python easily without confusion and without a computer science degree. Programming should be a liberal art available to everyone in the set of all "normal" educated people. Some developers (themselves perhaps with degrees Ph.D. in mathematics or computer science) forget about the fact that "normal" educated people want to leverage their computer (maybe with python) for problem solution without having to become a professional computer scientist. I am advocating for those people.

You want to remove lambda because it causes confusion. Okay, for the sake
of the argument I will agree that lambda is confusing. Do you know what
else is confusing?

I don't want to remove anything at this point. I am only suggesting that over time the python community might evaluate whether the lambda (map, filter, reduce) thing is a language benefit. If so, manet in aeternum. Elif, deprecate it and over time phase it out completely. Its a community decision of course, and I'm NOT demanding anything.

Threading is confusing. So is multiprocessing. So are databases. Unicode
is confusing. First-class functions are confusing. Recursion is
confusing. Closures are confusing. List comprehensions are confusing.
What the hell are trampolines? I'm certainly confused by them.

Argument by analogy almost never works. Please don't confuse my word "confusing" with your interpretation "complicated". Actually, I do not find any of those above mentioned as "confusing," while I do admit they are complicated--even extremely complicated. An intelligent person educated in the liberal arts should be able to sit down over time and pick-up the concepts in a new area--without--being confused by the material or presentation. Lambda is confusing NOT because its complicated (because its not) but because 1) it does not work like other lambda concepts in functional programming, and 2) because the syntax does not lend itself easily to immediate interpretation (by normal people) nor does it lend itself easily to explanation even in the best effort.

If we remove lambda because it is confusing, shouldn't we also remove all
these other confusing things? Where shall we stop?

   No.   see above.

Should we stop only when Python is a confusion-free, utterly useless toy
language? I don't think so. Or should we stop *before* going down that
path? You want to single out lambda. I don't think we should.

   No.   see above.

I didn't say that Python can be used as a functional language. I said you
can write functional code in Python. And that is so obviously true that I
cannot believe that you are disputing it.

I'm not disputing that, not in the least. But advertising that python can be used to write functional code is misleading (particularly when lambda is included ;map,filter, reduce) because those who KNOW functional programming are going to be either 1) confused, or more likely, 2) disappointed. Yes, I can make a nameless function (expression) and pass it to another function as an argument. True enough, and powerful enough, but very confusing when the other aspects of functional programming with lambda do not hold precisely. Ok, functional with caveats.

In fact, I have gone out of my way to NOT use
lambda because I am fully aware that the BDFL hates it.

In other words, you have had situations where you *could have* used
lambda, perhaps even *should have* used lambda, but you intentionally
went *out of your way* (i.e. made the job harder than it needed to be) to
avoid it, just to slavishly ape the BDFL.

No, no, no, not at all. I went out-of-my-way to understand how inner functions could do everything lambda does. I use inner functions, not lambda, and everything works well; not to ape the BDFL, but because it does not appear that lambda is a stable concept, and because I want other people "in the normal" category to be able to support or at least read my code.

Thank you for just proving my point for me. Your code would have been
better, or at least easier, with lambda. Removing it would make the
language worse, not better.

   No.   see above.

lambda was designed to allow you to create anonymous functions
in an expression, not as a statement. There is *no other way* to do that
in Python.

Yes, and I agree, and if that were *necessary* we wouldn't be having this conversation. The point is that there is *no* reason that you must code your script that way.

Would you like to discard def as well? No? Why not?

I am not advocating discarding anything. I am suggesting that lambda is not necessary and might be deprecated without too much trouble; if the community sees fit. That is all.

Since the name-space and arguably "def" itself is perhaps the most powerful aspect of python generally (extensibility) than of course the answer to your question is obvious, and discussing it would be silly.

def is fine, lambda not so much. BUT I'm not demanding anyone discard it at the moment. Try to remember Aristotle's mean.


marcus
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to