>>> lambda x: x # A lambda expression with one parameter x
<function <lambda> at ...>
______
>>> a = lambda x: x # Assigning the lambda function to the name a
>>> a(5)
5
______
>>> (lambda: 3)() # Using a lambda expression as an operator in a call exp.
3
______
>>> b = lambda x: lambda: x # Lambdas can return other lambdas!
>>> c = b(88)
>>> c
<function <lambda> at ...>
______
>>> c()
88
______
>>> d = lambda f: f(4) # They can have functions as arguments as well.
>>> def square(x):
... return x * x
>>> d(square)
16
______
>>> x = None # remember to review the rules of WWPD given above!
>>> x
>>> lambda x: x
None
______
>>> z = 3
>>> e = lambda x: lambda y: lambda: x + y + z
>>> e(0)(1)()
4
______
>>> f = lambda z: x + z
>>> f(3)
NameError: name 'x' is not defined
______
>>> higher_order_lambda = lambda f: lambda x: f(x)
>>> g = lambda x: x * x
>>> higher_order_lambda(2)(g) # Which argument belongs to which function call?
Error
______
>>> higher_order_lambda(g)(2)
4
______
>>> call_thrice = lambda f: lambda x: f(f(f(x)))
>>> call_thrice(lambda y: y + 1)(0)
3
______
>>> print_lambda = lambda z: print(z) # When is the return expression of a lambda expression executed?
>>> print_lambda
-
______
>>> one_thousand = print_lambda(1000)
1000
______
>>> one_thousand
N/A
______
Q2: WWPD: Higher Order Functions
>>> def even(f):
... def odd(x):
... if x < 0:
... return f(-x)
... return f(x)
... return odd
>>> steven = lambda x: x
>>> stewart = even(steven)
>>> stewart
None
______
>>> stewart(61)
None
______
>>> stewart(-4)
None
______