lambda Expressions
This page was last reviewed on Mar 22, 2024.
Dot Net Perls
Lambda. Python programs often use the lambda keyword. Methods like map() can receive a lambda to specify their behavior. In this way we can specify behavior as arguments.
Lambda limitations. We cannot have multiple statements in a lambda expression. If we require many statements in a complex method, consider a def.
First example. Lambda expression syntax uses the lambda keyword. The arguments are specified after. A lambda is an object: we can pass it to a def that receives arguments.
Part 1 Here 2 lambdas are created. The first is called "square" and it receives one argument "n" and returns "n * n".
Part 2 We pass the lambdas as an argument to our apply() function. Our lambda expressions are objects.
Part 3 In apply, we call the lambda argument like a function. The logic in the lambda expressions is executed.
def apply(f, n): # Part 3: invoke the lambda. result = f(n) print("RESULT:", result) # Part 1: create 2 similar lambdas. square = lambda n: n * n cube = lambda n: n * n * n # Part 2: pass lambdas to apply method. apply(square, 4) apply(cube, 3)
Lambda usage. Here we define a lambda that receives no arguments. It simply returns an expression. Here it returns the sum of the numbers 1, 2 and 3 (which is 6).
Detail We can assign a variable to a lambda expression and then invoke the lambda with parentheses. We call it like any other function.
Here To get the value 6 in this program, we invoke x. We then print the value it returns (stored in y).
So Lambdas can be passed to other methods. They can be stored in variables. And those variables can be called like methods.
# Assign variable to lambda expression. x = lambda: sum(range(1, 4)) # Invoke lambda expression. y = x() print(y)
None. Many statements, like print(), return None. This is a valid return value for a lambda. We can specify a lambda with side effects, and a None return value.
# This lambda has a side effect. # ... Print returns None. p = lambda x: print(x) p("Hello") p("World")
Hello World
Nested. A lambda can call another. This can simplify complex computations—we assign names to parts of a computation. The order the lambdas appear in the file does not matter.
Detail Recursion can occur. This may result in a RuntimeError: maximum recursion depth exceeded error.
add_two = lambda n: n + 2 multiply_add_two = lambda n: add_two(n * 2) # Call lambda in lambda. print(multiply_add_two(3)) print(multiply_add_two(5))
8 12
Macros. In older languages like C a macro is an easy way to combine code statements. It reduces repetitive typing. A lambda can be used in this way.
Here We use a lambda X to combine two string method calls. This is like a macro for those invocations. Typing is reduced.
line1 = "A cat, a dog " line2 = " a bird, a mountain" # Use X as an alias for two methods. x = lambda s: s.strip().upper() # Call the lambda to shorten the program's source. line1b = x(line1) line2b = x(line2) print(line1b) print(line2b)
Avoiding lambda. Sometimes developers use a lambda with one argument and one result, but the lambda is not needed. Here we can use a function name (like math.sqrt) instead of a lambda.
And When we avoid the lambda, the code becomes clearer and shorter. The lambda does not add much in this case.
Note Sometimes a program can benefit from lambda when the lambda increases the "symmetry" of the program—other places also use lambda.
import math values = [10, 20, 30] # Apply sqrt to all elements in the list with map. result1 = map(math.sqrt, values) # We can use a lambda, but it is not needed. result2 = map(lambda x: math.sqrt(x), values) print("values:", values) print("math.sqrt:", list(result1)) print("lambda:", list(result2))
values: [10, 20, 30] math.sqrt: [3.1622776601683795, 4.47213595499958, 5.477225575051661] lambda: [3.1622776601683795, 4.47213595499958, 5.477225575051661]
Lambda, benchmark. Here we test lambda performance. The square() method is rewritten in the def method syntax. We then benchmark the methods against each other.
Version 1 The program tests the performance of the def method call. We call it ten million times.
Version 2 The program times the lambda expression method call. We also call it ten million times.
Result We find that methods written with the def keyword and with the lambda keyword are close in performance.
import time # Method. def square1(n): return n ** 2 # Lambda method. square2 = lambda n: n ** 2 print(time.time()) # Version 1: use def method. i = 0 while i < 10000000: square1(1) i += 1 print(time.time()) # Version 2: use lambda method. i = 0 while i < 10000000: square2(1) i += 1 print(time.time())
1346613154.399 1346613158.919 (Def = 4.52 s) 1346613163.397 (Lambda = 4.48 s)
Function objects provide many possibilities. We specify these objects with the lambda syntax form. And when we pass them to other functions, we develop higher-order procedures.
Dot Net Perls is a collection of tested code examples. Pages are continually updated to stay current, with code correctness a top priority.
Sam Allen is passionate about computer languages. In the past, his work has been recommended by Apple and Microsoft and he has studied computers at a selective university in the United States.
This page was last updated on Mar 22, 2024 (simplify).
© 2007-2024 Sam Allen.