Wyrażenia lambda

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)

Programowanie współbieżne, wieloprocesowe