Python Funkcje lambda z PRZYKŁADAMI
⚡ Inteligentne podsumowanie
Funkcje lambda w Python To małe, anonimowe funkcje zdefiniowane za pomocą słowa kluczowego lambda zamiast def. Przechowują pojedyncze wyrażenie, przyjmują dowolną liczbę argumentów i często są przekazywane bezpośrednio do funkcji wbudowanych, takich jak map(), filter() i sorted().

Do czego służy funkcja Lambda Python?
A Funkcja Lambda w Python programowanie jest funkcją anonimową lub funkcją nie mającą nazwy. Jest to mała i ograniczona funkcja posiadająca nie więcej niż jedną linię. Podobnie jak normalna funkcja, funkcja Lambda może mieć wiele argumentów w jednym wyrażeniu.
In Python, wyrażenia lambda (lub formularze lambda) są wykorzystywane do konstruowania funkcji anonimowych. Aby to zrobić, użyjesz lambda słowo kluczowe (tak jak używasz def w celu zdefiniowania funkcji normalnych). Każda anonimowa funkcja, w której ją zdefiniujesz Python będzie składał się z 3 zasadniczych części:
- Słowo kluczowe lambda.
- Parametry (lub zmienne powiązane) i
- Ciało funkcji.
Funkcja lambda może mieć dowolną liczbę parametrów, ale treść funkcji może zawierać tylko pierwszej wyrażenie. Co więcej, lambda jest zapisana w jednym wierszu kodu i można ją natychmiast wywołać. Wszystko to zobaczysz w akcji w nadchodzących przykładach.
Składnia i przykłady
Formalna składnia zapisu funkcji lambda jest podana poniżej:
lambda p1, p2: expression
Tutaj p1 i p2 są parametrami przekazywanymi do funkcji lambda. Możesz dodać tyle lub kilka parametrów, ile potrzebujesz.
Należy jednak zauważyć, że nie używamy nawiasów wokół parametrów, jak w przypadku standardowych funkcji. Ostatnia część (wyrażenie) to dowolne prawidłowe Python wyrażenie, które działa na parametrach podanych funkcji.
1 przykład
Skoro już wiesz o lambdach, spróbujmy na przykładzie. Więc otwórz swój IDLE i wpisz:
adder = lambda x, y: x + y print (adder (1, 2))
Code Wyjaśnienie
Tutaj definiujemy zmienną, która będzie przechowywać wynik zwrócony przez funkcję lambda.
1. Słowo kluczowe lambda używane do definiowania funkcji anonimowej.
2. x i y to parametry, które przekazujemy do funkcji lambda.
3. To jest treść funkcji, która dodaje dwa przekazane przez nas parametry. Zauważ, że jest to pojedyncze wyrażenie. Nie można zapisać wielu instrukcji w treści funkcji lambda.
4. Wywołujemy funkcję i drukujemy zwróconą wartość.
2 przykład
To był podstawowy przykład pozwalający zrozumieć podstawy i składnię lambdy. Spróbujmy teraz wydrukować lambdę i zobaczyć wynik. Ponownie otwórz… IDLE i wpisz:
#What a lambda returns string='some kind of a useless lambda' print(lambda string : print(string))
Teraz zapisz plik i naciśnij F5, aby uruchomić program. To jest wynik, który powinieneś otrzymać.
Wyjście:
<function <lambda> at 0x00000185C3BF81E0>
Co tu się dzieje? Przyjrzyjmy się kodowi, aby lepiej to zrozumieć.
Code Wyjaśnienie:
1. Tutaj definiujemy ciąg który przekażesz jako parametr do funkcji lambda.
2. Deklarujemy lambdę, która wywołuje polecenie print i drukuje wynik.
Ale dlaczego program nie drukuje przekazanego ciągu? Dzieje się tak, ponieważ sama lambda zwraca obiekt funkcji. W tym przykładzie lambda nie jest… o nazwie przez funkcję drukowania, ale jest po prostu powrót Obiekt funkcji i lokalizacja w pamięci, w której jest przechowywany. To właśnie jest wyświetlane na konsoli.
3 przykład
Jeśli jednak napiszesz taki program:
#What a lambda returns #2 x="some kind of a useless lambda" (lambda x : print(x))(x)
Następnie naciśnij klawisz F5, a zobaczysz taki wynik.
Wyjście:
some kind of a useless lambda
Teraz wywoływana jest funkcja lambda, a przekazywany przez nas ciąg znaków zostaje wydrukowany na konsoli. Ale co to za dziwna składnia i dlaczego definicja funkcji lambda jest ujęta w nawiasy? Spróbujmy to teraz zrozumieć.
Code Wyjaśnienie:
1. Oto ten sam ciąg znaków, który zdefiniowaliśmy w poprzednim przykładzie.
2. W tej części definiujemy lambdę i wywołujemy ją natychmiast, przekazując ciąg znaków jako argument. To tzw. IIFE, o którym dowiesz się więcej w kolejnych sekcjach tego samouczka.
4 przykład
Przyjrzyjmy się ostatniemu przykładowi, aby zrozumieć, jak wykonywane są lambdy i funkcje zwykłe. Otwórz więc IDLE i w nowym pliku wpisz następujące polecenie:
#A REGULAR FUNCTION def guru( funct, *args ): funct( *args ) def printer_one( arg ): return print (arg) def printer_two( arg ): print(arg) #CALL A REGULAR FUNCTION guru( printer_one, 'printer 1 REGULAR CALL' ) guru( printer_two, 'printer 2 REGULAR CALL \n' ) #CALL A REGULAR FUNCTION THRU A LAMBDA guru(lambda: printer_one('printer 1 LAMBDA CALL')) guru(lambda: printer_two('printer 2 LAMBDA CALL'))
Teraz zapisz plik i naciśnij F5, aby uruchomić program. Jeśli nie popełniłeś żadnych błędów, wynik powinien wyglądać mniej więcej tak.
Wyjście:
printer 1 REGULAR CALL printer 2 REGULAR CALL printer 1 LAMBDA CALL printer 2 LAMBDA CALL
Code Wyjaśnienie:
1. Funkcja o nazwie guru, która przyjmuje inną funkcję jako pierwszy parametr i wszelkie inne argumenty następujące po nim.
2. printer_one to prosta funkcja, która drukuje przekazany jej parametr i go zwraca.
3. printer_two jest podobne do printer_one, ale bez polecenia return.
4. W tej części wywołujemy funkcję guru i przekazujemy funkcje drukarki oraz ciąg znaków jako parametry.
5. Oto składnia umożliwiająca wykonanie czwartego kroku (tj. wywołanie funkcji guru), ale przy użyciu lambd.
W następnej sekcji dowiesz się, jak używać funkcji lambda z mapa(), zmniejszyć(), filtr() in Python.
Używanie lambd z Python wbudowane
Funkcje lambda zapewniają elegancki i wydajny sposób wykonywania operacji przy użyciu wbudowanych metod w Python. Jest to możliwe, ponieważ lambdy można wywołać natychmiast i przekazać jako argument do tych funkcji.
IIFE w Python Lambda
IIFE oznacza natychmiast wywołane wykonanie funkcji. Oznacza to, że funkcja lambda jest wywoływalna od razu po jej zdefiniowaniu. Zrozumiemy to na przykładzie: uruchom IDLE i wpisz:
(lambda x: x + x)(2)
Oto dane wyjściowe i wyjaśnienie kodu:
Ta możliwość natychmiastowego wywoływania lambd pozwala na użycie ich w funkcjach takich jak map() i redukuj(). Jest to przydatne, ponieważ możesz nie chcieć ponownie korzystać z tych funkcji.
lambdy w filter()
Funkcja filtru służy do wybierania określonych elementów z sekwencji elementów. Sekwencją może być dowolny iterator, taki jak listy, zestawy, krotki itp.
Elementy, które zostaną wybrane, opierają się na predefiniowanym ograniczeniu. Wymagane są 2 parametry:
- Funkcja definiująca ograniczenie filtrowania
- Sekwencja (dowolny iterator, taki jak listy, krotki itp.)
Na przykład,
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = filter (lambda x: x > 4, sequences) print(list(filtered_result))
Oto wynik:
[10, 8, 7, 5, 11]
Code Wyjaśnienie:
1. W pierwszym poleceniu definiujemy listę zwaną sekwencjami, która zawiera pewne liczby.
2. Tutaj deklarujemy zmienną o nazwie filtered_result, która będzie przechowywać przefiltrowane wartości zwrócone przez funkcję filter().
3. Funkcja lambda, która działa na każdym elemencie listy i zwraca wartość true, jeśli jest ona większa niż 4.
4. Wydrukuj wynik zwrócony przez funkcję filtrującą.
lambdy na mapie()
Funkcja mapy służy do zastosowania określonej operacji do każdego elementu sekwencji. Podobnie jak filter(), przyjmuje ona również 2 parametry:
- Funkcja definiująca operację, która ma zostać wykonana na elementach
- Jedna lub więcej sekwencji
Na przykład, oto program, który drukuje kwadraty liczb z podanej listy:
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = map (lambda x: x*x, sequences) print(list(filtered_result))
Wyjście:
[100, 4, 64, 49, 25, 16, 9, 121, 0, 1]
Code Wyjaśnienie:
1. Tutaj definiujemy listę zwaną sekwencjami, która zawiera pewne liczby.
2. Deklarujemy zmienną o nazwie filtered_result, która będzie przechowywać mapowane wartości.
3. Funkcja lambda, która działa na każdym elemencie listy i zwraca kwadrat tej liczby.
4. Wydrukuj wynik zwrócony przez funkcję mapy.
lambdy w funkcji redukcji()
Funkcja reduce, podobnie jak map(), służy do stosowania operacji do każdego elementu sekwencji. Jednak różni się od map w swoim działaniu. Oto kroki, które wykonuje funkcja reduce(), aby obliczyć wynik:
Krok 1) Wykonaj zdefiniowaną operację na pierwszych 2 elementach sekwencji.
Krok 2) Zapisz ten wynik.
Krok 3) Wykonaj operację z zapisanym wynikiem i następnym elementem sekwencji.
Krok 4) Powtarzaj, aż nie pozostanie już więcej elementów.
Przyjmuje również dwa parametry:
- Funkcja definiująca operację, która ma zostać wykonana
- Sekwencja (dowolny iterator, taki jak listy, krotki itp.)
Oto na przykład program, który zwraca iloczyn wszystkich elementów na liście:
from functools import reduce sequences = [1,2,3,4,5] product = reduce (lambda x, y: x*y, sequences) print(product)
Oto wynik:
120
Code Wyjaśnienie:
1. Importuj reduce z modułu functools.
2. Tutaj definiujemy listę zwaną sekwencjami, która zawiera pewne liczby.
3. Deklarujemy zmienną o nazwie product, która będzie przechowywać zmniejszoną wartość.
4. Funkcja lambda, która działa na każdym elemencie listy. Zwraca iloczyn tej liczby zgodnie z poprzednim wynikiem.
5. Wypisz wynik zwrócony przez funkcję reduce.
Dlaczego (i dlaczego nie) używać funkcji lambda?
Jak zobaczysz w następnej sekcji, lambdy są traktowane tak samo jak zwykłe funkcje na poziomie interpretera. W pewnym sensie można powiedzieć, że lambdy zapewniają zwartą składnię do pisania funkcji zwracających pojedyncze wyrażenie.
Powinieneś jednak wiedzieć, kiedy warto używać lambd, a kiedy należy ich unikać. W tej sekcji poznasz niektóre zasady projektowania stosowane przez Python programistów podczas pisania lambd.
Jednym z najczęstszych przypadków użycia lambd jest programowanie funkcyjne, ponieważ Python wspiera paradygmat (lub styl) programowania znany jako programowanie funkcjonalne.
Pozwala ona na przekazanie funkcji jako parametru do innej funkcji (na przykład w mapie, filtrze itp.). W takich przypadkach użycie lambd oferuje elegancki sposób na utworzenie funkcji jednorazowej i przekazanie jej jako parametru.
Kiedy nie należy stosować Lambdy?
Nigdy nie pisz skomplikowanych funkcji lambda w środowisku produkcyjnym. Będzie bardzo trudno koderom, którzy utrzymują Twój kod, odszyfrować go. Jeśli piszesz złożone wyrażenia jednowierszowe, o wiele lepszą praktyką byłoby zdefiniowanie właściwej funkcji. Jako najlepszą praktykę musisz pamiętać, że prosty kod jest zawsze lepszy niż złożony kod.
Lambdy a funkcje regularne
Jak wspomniano wcześniej, lambdy to po prostu funkcje, do których nie przypisano identyfikatora. Mówiąc prościej, są to funkcje bez nazw (stąd anonimowe). Poniżej znajduje się tabela ilustrująca różnicę między lambdami a zwykłymi funkcjami w Python.
| Lambdy | Funkcje regularne |
|---|---|
Składnia:
lambda x : x + x
|
Składnia:
def (x) : return x + x |
| Funkcje lambda mogą mieć tylko jedno wyrażenie w swoim ciele. | Funkcje regularne mogą mieć w swojej treści wiele wyrażeń i instrukcji. |
| Lambdy nie mają przypisanej nazwy. Dlatego nazywane są również funkcjami anonimowymi. | Funkcje regularne muszą mieć nazwę i podpis. |
| Lambdy nie zawierają instrukcji return, ponieważ treść jest zwracana automatycznie. | Funkcje, które muszą zwracać wartość, powinny zawierać polecenie return. |
Wyjaśnienie różnic
Podstawowa różnica między lambdą a funkcją regularną polega na tym, że funkcja lambda ocenia tylko pojedyncze wyrażenie i zwraca obiekt funkcji. W związku z tym możemy nazwać wynik funkcji lambda i wykorzystać go w naszym programie, tak jak to zrobiliśmy w poprzednim przykładzie.
Zwykła funkcja w powyższym przykładzie wyglądałaby następująco:
def adder (x, y): return x + y print (adder (1, 2))
Tutaj musimy zdefiniować a Nazwa dla funkcji która powraca wynik, gdy my wezwanie Funkcja lambda nie zawiera instrukcji return, ponieważ będzie miała tylko jedno wyrażenie, które jest zawsze domyślnie zwracane. Nie trzeba nawet przypisywać lambdy, ponieważ można ją natychmiast wywołać (patrz poprzednia sekcja). Jak zobaczysz, lambdy stają się szczególnie potężne, gdy używamy ich z Pythonwbudowane funkcje.
Jednak nadal możesz się zastanawiać, czym różnią się lambdy od funkcji zwracającej pojedyncze wyrażenie (tak jak powyżej). Na poziomie tłumacza nie ma dużej różnicy. Może to zabrzmieć zaskakująco, ale dowolna funkcja lambda, którą zdefiniujesz Python interpretowany jest przez tłumacza jako normalna funkcja.
Na poziomie kodu bajtowego obie definicje są obsługiwane w ten sam sposób przez Python interpreter. Teraz nie można nazwać funkcji lambda ponieważ jest zarezerwowany przez Python, ale każda inna nazwa funkcji da ten sam kod bajtowy.
