Funkcje anonimowe

https://docs.python.org/3/reference/expressions.html#lambda

WPROWADZENIE

Lambda jest wyrażeniem (lambda expression), a nie instrukcją, dzięki czemu może pojawić się w miejscu niedostępnym dla instrukcji def. Lambda zwraca obiekt funkcji, do którego można opcjonalnie przypisać nazwę. Ciałem lambda jest pojedyncze wyrażenie, a nie blok instrukcji. Przykładowo lambda nie może zawierać print [Py2], bo to jest instrukcja (podobnie yield, return).


# Do funkcji lambda można przyporządkować nazwę.

func1 = lambda x, y, z: x + y + z

print(func1(2, 3, 4))   # 9

def func2(x, y, z): return x + y + z   # równoważna funkcja

print(func2(2, 3, 4))   # 9

# Formalnie Python widzi różnicę między func1 i func2, co można sprawdzić
# przez help(func1) i help(func2).

# W argumentach lambda można używać argumentów domyślnych.

func3 = (lambda x=0, y=0, z=0: x + y + z)
print(func3(4, 5))

# Lambda można stosować w funkcji map().

map(lambda x: 2*x+1, range(9))
[2*x+1 for x in range(9)]   # lista składana

# Z lambda można budować listę lub słownik.

action = {   # wcięcia dla czytelności
    "jeden": lambda x: x,
    "dwa": lambda x: x**2,
    "trzy": lambda x: x**3,
}
print(action["dwa"](10))   # pow(10, 2) = 100

powers = [   # wcięcia dla czytelności
    lambda x : 1,
    lambda x: x, 
    lambda x: pow(x, 2), 
    lambda x: pow(x, 3),
]
print(powers[2](3))   # pow(3, 2) = 9

# Zastosowanie logiki wyboru.

lambda_abs = lambda x: -x if x < 0 else x
lambda_min = lambda x, y: x if x < y else y
lambda_max = lambda x, y: x if x > y else y

# Zastosowanie lambda do sortowania.

number_list.sort(reverse=True)
number_list.sort(key=lambda x: -x)

pair_list.sort(key=lambda t: abs(t[0]) + abs(t[1]))   # metryka taksówkowa

pair_list.sort(key=lambda t: (-t[0], t[1]))
# Sortujemy malejąco ze względu na t[0].
# Jeżeli t[0] są równe, to sortujemy rosnąco ze względu na t[1].
# UWAGA To nie jest to samo, co dwa kolejne sortowania
# pair_list.sort(key=lambda t: -t[0])
# pair_list.sort(key=lambda t: t[1])