Python Funkcje lambda z PRZYKŁADAMI
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.
Zauważ jednak, że nie używamy nawiasów wokół parametrów, jak to robimy w przypadku zwykłych funkcji. Ostatnia część (wyrażenie) to dowolne prawidłowe wyrażenie python, które działa na parametrach podanych przez Ciebie dla 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))
Oto wynik:
3
Objaśnienie kodu
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 plik 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? Spójrzmy na kod, aby lepiej zrozumieć.
Objaśnienie kodu
- Tutaj definiujemy a ciąg który przekażesz jako parametr do lambdy.
- Deklarujemy lambdę, która wywołuje instrukcję print i drukuje wynik.
Ale dlaczego program nie drukuje ciągu, który przekazujemy? Dzieje się tak, ponieważ sama lambda zwraca obiekt funkcji. W tym przykładzie lambda nie jest o nazwie za pomocą funkcji drukowania, ale po prostu powrót obiekt funkcji i miejsce w pamięci, w którym jest przechowywany. To właśnie zostanie wydrukowane 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)
I uruchom go, naciskając F5, zobaczysz taki wynik.
Wyjście:
some kind of a useless lambda
Teraz wywoływana jest lambda, a przekazywany przez nas ciąg znaków jest drukowany na konsoli. Ale czym jest ta dziwna składnia i dlaczego definicja lambdy jest ujęta w nawiasy? Zrozummy to teraz.
Objaśnienie kodu
- Oto ten sam ciąg, który zdefiniowaliśmy w poprzednim przykładzie.
- W tej części definiujemy lambdę i natychmiast ją wywołujemy, przekazując ciąg znaków jako argument. Jest to coś, co nazywa się IIFE i dowiesz się więcej na ten temat w kolejnych sekcjach tego samouczka.
4 przykład
Spójrzmy na ostatni przykład, aby zrozumieć, w jaki sposób wykonywane są lambdy i funkcje regularne. Więc otwórz swój 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
Objaśnienie kodu
- Funkcja o nazwie guru, która przyjmuje inną funkcję jako pierwszy parametr i wszelkie inne argumenty następujące po nim.
- drukarka_one to prosta funkcja, która wypisuje przekazany jej parametr i zwraca go.
- drukarka_two jest podobna do drukarki_jeden, ale nie zawiera instrukcji return.
- W tej części wywołujemy funkcję guru i przekazujemy funkcje drukarki oraz ciąg znaków jako parametry.
- To jest składnia umożliwiająca osiągnięcie 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ć(), i 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. Rozumiemy to na przykładzie; odpal swoje 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 pewnych wcześniej zdefiniowanych ograniczeniach. Przyjmuje 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]
Wyjaśnienie kodu:
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 map służy do stosowania określonej operacji do każdego elementu w sekwencji. Podobnie jak filter(), przyjmuje również 2 parametry:
- Funkcja definiująca operacje do wykonania 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]
[KR1]
Wyjaśnienie kodu:
- Tutaj definiujemy listę zwaną sekwencjami, która zawiera pewne liczby.
- Deklarujemy zmienną o nazwie filtered_result, która będzie przechowywać zmapowane wartości
- Funkcja lambda, która działa na każdym elemencie listy i zwraca kwadrat tej liczby.
- 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
Wyjaśnienie kodu:
- Importuj redukcję z modułu functools
- Tutaj definiujemy listę zwaną sekwencjami, która zawiera pewne liczby.
- Deklarujemy zmienną o nazwie produkt, w której będzie przechowywana zmniejszona wartość
- Funkcja lambda działająca na każdym elemencie listy. Zwróci iloczyn tej liczby zgodnie z poprzednim wynikiem.
- Wydrukuj wynik zwrócony przez funkcję redukcji.
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.
Należy jednak wiedzieć, kiedy warto używać lambd, a kiedy ich unikać. W tej sekcji poznasz niektóre zasady projektowania stosowane przez programistów Pythona podczas pisania lambd.
Jednym z najczęstszych przypadków użycia lambd jest programowanie funkcjonalne, np Python wspiera paradygmat (lub styl) programowania znany jako programowanie funkcjonalne.
Umożliwia podanie funkcji jako parametru innej funkcji (na przykład w mapie, filtrze itp.). W takich przypadkach użycie lambd stanowi elegancki sposób na utworzenie jednorazowej funkcji 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[vV4][J5] po prostu funkcje, które nie mają powiązanego z nimi identyfikatora. Mówiąc prościej, są to funkcje bez nazw (stąd anonimowe). Oto tabela ilustrująca różnicę między lambdami a funkcjami regularnymi w Pythonie.
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ą powiązanej nazwy. Dlatego są one również nazywane 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ć instrukcję 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 it. Funkcja lambda nie zawiera instrukcji return, ponieważ będzie miała tylko jedno wyrażenie, które jest zawsze domyślnie zwracane. Nie musisz nawet przypisywać lambdy, ponieważ można ją natychmiast wywołać (zobacz następną sekcję). Jak zobaczysz w poniższym przykładzie, 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.
Jak widać na diagramie, obie definicje są obsługiwane w ten sam sposób przez interpreter Pythona podczas konwersji na kod bajtowy. Teraz nie można nazwać funkcji lambda ponieważ jest zarezerwowany przez Python, ale każda inna nazwa funkcji zwróci ten sam kod bajtowy [KR6].
Podsumowanie
- Lambdy, znane również jako funkcje anonimowe, to małe, ograniczone funkcje, które nie potrzebują nazwy (tzn. identyfikatora).
- Każda funkcja lambda w Python składa się z 3 zasadniczych części:
- Słowo kluczowe lambda.
- Parametry (lub zmienne powiązane) i
- Ciało funkcji.
- Składnia zapisu lambdy jest następująca: parametr lambda: wyrażenie
- Lambdy mogą mieć dowolną liczbę parametrów, ale nie są one ujęte w nawiasy klamrowe
- Lambda może mieć tylko 1 wyrażenie w treści funkcji, które jest zwracane domyślnie.
- Na poziomie kodu bajtowego nie ma dużej różnicy pomiędzy sposobem obsługi lambd i funkcji zwykłych przez interpreter.
- Lambdy obsługują IIFE poprzez następującą składnię: (parametr lambda: wyrażenie) (argument)
- Wyrażenia lambda są powszechnie używane z następującymi wbudowanymi funkcjami języka Python:
- Filtr: filtr (parametr lambda: wyrażenie, sekwencja iterowalna)
- Mapa: mapa (parametr lambda: wyrażenie, sekwencje iterowalne)
- Redukcja: redukcja (parametr lambda 1, parametr 2: wyrażenie, sekwencja iterowalna)
- Nie pisz skomplikowanych funkcji lambda w środowisku produkcyjnym, ponieważ będzie to trudne dla opiekunów kodu.
[J5]Dodałem tabelę, ale wyjaśnienie jest konieczne, aby zrozumieć różnice.