Question on lambdas

Terry Reedy tjreedy at udel.edu
Mon Dec 8 21:09:41 EST 2014


On 12/8/2014 8:53 PM, Chris Angelico wrote:
> On Tue, Dec 9, 2014 at 12:44 PM, Christoph Becker <cmbecker69 at gmx.de> wrote:
>> Ben Finney wrote:
>>
>>> It's best to remember that ‘lambda’ is syntactic sugar for creating a
>>> function; the things it creates are not special in any way, they are
>>> normal functions, not “lambdas”.
>>
>> Could you please elaborate why ‘lambda’ does not create “lambdas”.  I'm
>> a Python beginner (not new to programming, though), and rather confused
>> about your statement.
>
> For the same reason that "def" doesn't create "defs", and "for"
> doesn't create fors (uhh... the Force?). Both "lambda" and "def"
> create functions. Functions are things that can be called, and they're
> created by the "def" statement, the "lambda" expression, and very VERY
> occasionally, by directly calling the function constructor. You could
> distinguish between "lambda functions" and "def functions" if you
> like, but the distinction is almost never significant. In fact,
> usually you don't even need to distinguish between functions and other
> callables (types, objects with __call__ methods, bound method objects,
> etc, etc, etc).

To exemplify Chris's answer: Consider

 >>> def f1(a, b='hi'): return a+b

 >>> f2 = lambda a, b='hi': a+b
 >>>

I believe the only difference between any of the attributes of f1 and f2 is

 >>> f1.__name__
'f1'
 >>> f2.__name__
'<lambda>'
 >>> f1.__code__.co_name
'f1'
 >>> f2.__code__.co_name
'<lambda>'

All other values of corresponding attributes of f1 and f2, and 
f1.__code__ and f2.__code__, should be the same.  For instance

 >>> f1.__code__.co_varnames
('a', 'b')
 >>> f2.__code__.co_varnames
('a', 'b')

-- 
Terry Jan Reedy





More information about the Python-list mailing list