2024-08-27

Myśląc o Pythonie: Lambda

Witajcie! Dla przypomnienia, ostatnio, symbolicznie, zamknęliśmy pewien rozdział w funkcjach. Mianowicie artykułem o returnie zamknęliśmy niejako podstawy podstaw. Jeśli chodzi o funkcje. Wiemy więc już o nich troszkę. Wiemy, że są bardzo ważną koncepcją w programowaniu - m.in. pomagają przestrzegać zasady DRY, ale nie tylko. 😉 "Funkcje to czasowniki w programowani" parafrazując klasyka 😉 Dziś na scenę wkroczą funkcje anonimowe, zwane też lambda.

Mogliśmy przy okazji trochę już wspomnieć o przywołanym zjawisku. Jednak by formalności stało się zadość; funkcja anonimowa, to funkcja bez nazwy. Po co komu taki twór? No, czasem chcemy raz sobie użyć funkcji, żeby jej nie musieć od razu definiować, bo tylko tutaj jej użyjemy.

Wcześniej powiedzieliśmy sobie, że funkcja to takie coś co możemy raz zdefiniować i wykorzystywać wielokrotnie. Po co więc zjawisko będące w takiej opozycji do tego, czyli lambda. Są jednak przypadki gdy chcemy wykonać jakąś operację tylko w jednym miejscu. Przykładowo mamy jakiś zbiór wartości i chcemy tą samą operację wykonać tylko w tym miejscu na wszystkich wartościach. Jest to najczęstszy przykład użycia funkcji anonimowej.

Funkcje typu lambda są powszechne w wielu językach, Nasz wybranie, Python, nie jest tutaj wyjątkiem. Przydają się one, czasem jakaś inna funkcja wymaga podania funkcji jako argumentu - tutaj też się przydają.

Funkcje anonimowe - trochę teorii

Jak to działa, jak użyć? Przede wszystkim jak ze wszystkim, nie bać się 😉 Wracając jednak na siemię, bo filozofia to nie ta seria artykułów. Nie jest to konstrukcja trudna w stosowania (w końcu Python, heloł). Zobaczmy sobie przykład pokazujący funkcje anonimowe.

konstrukcja funkcji anonimowej - lambda

No i co to jest, ktoś mógłby zakrzyknąć. Niewątpliwie, jest to trochę inna konstrukcja od zwykłej funkcji, ale na pewno jest to coś z lambdą, o której mówiliśmy. W końcu ma słowo lambda w sobie. Po tym słowie, następuje argument, a po dwukropku to co z nim robimy (można chyba powiedzieć, że to ciało lambdy). Ogólny schemat pokazujący funkcje anonimowe w porównaniu do zwykłych poniżej. Tutaj funkcja przyjmuje argument a i go mnoży przez samego siebie.

schematyczne porównanie funkcji zwykłej do funkcji anonimowej - lambda

Oczywiście powyższy kod nie zadziała, jest niepoprawny, ale pokazuje jak wygląda funkcja nazwana, w porównaniu do tej anonimowej. Lambda jest na pewno dużo bardziej zwięzła, lakoniczna można by rzec.

Funkcje anonimowe - jak używać

Zobaczmy sobie teraz przykład funkcji lambda, która podwaja podaną wartość i przy okazji jak ją wywołać. No właśnie, zastanawiałeś się jak wywołać funkcje anonimową? Przecież nie po nazwie, bo lambda jej nie ma 😉 Funkcje anonimowe zwykle przypisujemy do zmiennej, jeśli chcemy móc je jakoś 'uchwycić'.

funkcje anonimowe -użycie, czyli funkcje typu lambda

Zauważ co się stało, stworzyliśmy sobie funkcję anonimową, która przyjmuje jako argument x. Po podstawieniu pod x tego co jej podamy, mnoży ten x przez dwa. Następnie przypisaliśmy tą funkcję anonimową do zmiennej, by móc jakoś ją 'uchwycić', jakoś się do niej odwołać. Finalnie użyliśmy zmiennej jak funkcji, po prostu podając jej nazwę. Po nazwie zaś podaliśmy, w nawiasach zwykłych, argument. Wywołanie zatem, wyglądała jak najzwyczajniejsze użycie funkcji.

I tak oto właśnie można użyć funkcji lambda, po prostu przypisać jej deklaracje do zmiennej, po czym wywołać tą zmienną tak jak wywołujemy funkcje. Ciekawe, prawda?

Mała dygresja na temat funkcji

Skoro już jesteśmy przy tym, pokażę Ci jeszcze jedną ciekawą rzecz, patrz uważnie. Zadeklaruję zwykłą funkcje, przypiszę jej nazwę do zmiennej, a następnie użyję tej zmiennej zamiast funkcji.

sztuczka, którą uświadamiają funkcje anonimowe, referencje do funkcji.

Czy wiesz co tutaj się stało i dlaczego? Jak to działa? Byłem w stanie użyć funkcji o nazwie funkcja. Nie wywołałem jej jednak po jej nazwie, ale po innej nazwie. Stało się tak dzięki temu, że tak naprawdę, nazwa funkcji wskazuje tylko na funkcje, więc równie dobrze coś innego może zacząć wskazywać na ową funkcję. Przypisując nazwę funkcji do zmiennej wynik, tak naprawdę teraz też wynik wskazuje na tą funkcję, co umożliwia użycie zmiennej wynik tak jak nazwy funkcji z deklaracji. Magia Pythona 😉

Teraz możemy sobie jeszcze sprawdzić czym w sumie jest taka zmienna, do której przypisano funkcję anonimową.

funkcje anonimowe - czym tak naprawdę jest zmienna, do której je przepisujemy.

Jak widzimy jest to obiekt klasy function, teraz sprawdźmy czym jest zwykła funkcja (choć chyba się domyślasz co zobaczymy).

funkcje anonimowe i porównanie z funkcjami zwykłymi

Jak zatem widać, funkcje anonimowe są niczym innym jak zwykłą funkcją, tylko, że nie potrzebują nazwy, żeby istnieć. Wystarczy jakoś je wywołać 😉 Możemy jeszcze sprawdzić sobie, dla formalności, jak to wygląda przy wspomnianej "sztuczce".

funkcje anonimowe - dygresja związana z referencjami

Tutaj też nie ma zaskoczenia - wszystko tutaj jest funkcją 🙂

Oczywiście funkcje anonimowe mogą wykonywać jakie działanie sobie zdefiniujesz. Sama lambda zaś pełni ważną rolę w tak zwanym programowaniu funkcyjnym, jest to jeden z paradygmatów programowania.

Na koniec przeanalizuj sobie taki kod, spróbuj go może odtworzyć i odpowiedz sobie dlaczego wynikiem tutaj będzie cztery 😉

funkcje anonimowe - zagnieżdżanie

Miłej zabawy!

One comment on “Myśląc o Pythonie: Lambda”

Dodaj komentarz

linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram