While going developing OpenERP, I found the following piece of code
'app_date': lambda *a: time.strftime('%Y-%m-%d')
I know what lambda is.My question is why use lambda?Why not just
'app_date': time.strftime('%Y-%m-%d')
A lambda expression is a short block of code which takes in parameters and returns a value. Lambda expressions are similar to methods, but they do not need a name and they can be implemented right in the body of a method.
Lambda expressions basically express instances of functional interfaces (An interface with single abstract method is called functional interface. An example is java.lang.Runnable).
The "this" and "super" references within a lambda expression are the same as in the enclosing context. Since the lambda expression doesn't define a new scope, "this" keyword within a lambda expression signifies "this" parameter of a method where the lambda expression is residing.
We use lambda functions when we require a nameless function for a short period of time. In Python, we generally use it as an argument to a higher-order function (a function that takes in other functions as arguments). Lambda functions are used along with built-in functions like filter() , map() etc.
'app_date': time.strftime('%Y-%m-%d')
will evaluate the time.strftime
immediately. By wrapping it in a lambda, its execution is deferred until later (the time when you call the lambda). Roughly speaking, the difference is between "the time when I defined this" and "the time when I am using this". Look:
>>> d = {'a': time.time(), 'b': lambda: time.time()}
>>> d['a'], d['b']()
(1346913545.049, 1346913552.409)
>>> d['a'], d['b']()
(1346913545.049, 1346913554.518)
>>> d['a'], d['b']()
(1346913545.049, 1346913566.08)
I allowed some time to elapse in between each d['a'], d['b']()
. Note that d['a']
is always the same: it is the time when I defined d
. d['b']
is a function. d['b']()
(with parentheses) calls the function, which evaluates the time anew on each call, so it is different at each usage.
Also, this is nothing special about lambda
. Lambdas are just functions like any other. I could do the same with:
def func():
return time.time()
d = {'a': time.time(), 'b': func}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With