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.

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.

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ć'.

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.

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ą.

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

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".

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 😉

Miłej zabawy!

[…] rozmawialiśmy sobie o bardzo ciekawej rzeczy jaką są funkcje anonimowe, zwane też lambda, dziś natomiast pociągniemy dalej temat funkcji, choć związany bardziej z czymś innym, a […]