Skąd nazwa? https://pl.wikipedia.org/wiki/Rachunek_lambda
Wyrażenie
def identity(x):
return x
zapisujemy jako
lambda x: x
Jeśli uruchomimo to w konsoli, to możemy wywołać
_(5)
To tzw. przykład funkcji anonimowej.
By uruchomić to też w skrypcie, to potrzebujemy argumentu:
print((lambda x: x + 1)(2))
lub
add_one = lambda x: x + 1
add_one(2)
Możemy też tworzyć złożenia funkcji (funkcje wyższych rzedów):
high_ord_func = lambda x, func: x + func(x)
print(high_ord_func(2, lambda x: x * x))
print(high_ord_func(2, lambda x: x + 3))
Wyrażenia lambda “na dziś” słabo radzą sobie z
type hinting
np.
from typing import Callable
add_one: Callable[[int], int] = lambda x: x + 1
Możemy również skorzystać z różnych opcji argumentów jak dla funkcji:
(lambda x, y, z: x + y + z)(1, 2, 3)
(lambda x, y, z=3: x + y + z)(1, 2)
(lambda x, y, z=3: x + y + z)(1, y=2)
(lambda *args: sum(args))(1,2,3)
(lambda **kwargs: sum(kwargs.values()))(one=1, two=2, three=3)
(lambda x, *, y=0, z=0: x + y + z)(1, y=2, z=3)
Typ
string = 'abc'
print(lambda string: string)
Różnice względem zwykłej funkcji:
def cube(y):
print(f"Finding cube of number:{y}")
return y * y * y
lambda_cube = lambda num: num ** 3
print("invoking function defined with def keyword:")
print(cube(30))
print("invoking lambda function:", lambda_cube(30))
Przykłady praktyczne
r = lambda a: a + 15
print(r(10))
r = lambda x, y: x * y
print(r(12, 4))
subject_marks = [('English', 88), ('Science', 90), ('Maths', 97), ('Social sciences', 82)]
print("Original list of tuples:")
print(subject_marks)
subject_marks.sort(key=lambda x: x[1])
print("\nSorting the List of Tuples:")
print(subject_marks)
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print("Original list of integers:")
print(nums)
print("\nEven numbers from the said list:")
even_nums = list(filter(lambda x: x % 2 == 0, nums))
print(even_nums)
print("\nOdd numbers from the said list:")
odd_nums = list(filter(lambda x: x % 2 != 0, nums))
print(odd_nums)
array_nums1 = [1, 2, 3, 5, 7, 8, 9, 10]
array_nums2 = [1, 2, 4, 8, 9]
print("Original arrays:")
print(array_nums1)
print(array_nums2)
result = list(filter(lambda x: x in array_nums1, array_nums2))
print("\nIntersection of the said arrays: ", result)