Co to jest funkcja Lambda w Pythonie?
Lambda funkcji w Pythonie programowania jest anonimowa funkcja lub funkcja nie mając nazwę. Jest to mała i ograniczona funkcja mająca nie więcej niż jedną linię. Podobnie jak normalna funkcja, funkcja Lambda może mieć wiele argumentów z jednym wyrażeniem.
W Pythonie do konstruowania funkcji anonimowych wykorzystuje się wyrażenia lambda (lub formy lambda). Aby to zrobić, użyjesz słowa kluczowego lambda (tak jak używasz def do definiowania normalnych funkcji). Każda anonimowa funkcja zdefiniowana w Pythonie będzie miała 3 zasadnicze części:
- Słowo kluczowe lambda.
- Parametry (lub zmienne powiązane) i
- Treść funkcji.
Funkcja lambda może mieć dowolną liczbę parametrów, ale jej treść może zawierać tylko jedno wyrażenie. Co więcej, lambda jest napisane w pojedynczym wierszu kodu i może być również wywołane natychmiast. Wszystko to zobaczysz w akcji w kolejnych przykładach.
Z tego samouczka Lambda w Pythonie dowiesz się:
- Składnia i przykłady
- Używanie lambd z wbudowanymi funkcjami Pythona
- lambdy w filtrze ()
- lambdy na mapie ()
- lambdy w zmniejszeniu ()
- Dlaczego (i dlaczego nie) używać funkcji lambda?
- Lambdy a funkcje regularne
Składnia i przykłady
Formalna składnia do napisania funkcji lambda jest następująca:
lambda p1, p2: expression
Tutaj p1 i p2 są parametrami, które są przekazywane do funkcji lambda. Możesz dodać dowolną liczbę lub kilka parametrów.
Zwróć jednak uwagę, że nie używamy nawiasów wokół parametrów, tak jak robimy to w przypadku zwykłych funkcji. Ostatnia część (wyrażenie) to dowolne prawidłowe wyrażenie Pythona, które działa na parametrach podanych do funkcji.
Przykład 1
Teraz, gdy wiesz już o lambdach, wypróbujmy to na przykładzie. Więc otwórz IDLE i wpisz:
adder = lambda x, y: x + yprint (adder (1, 2))
Oto wynik:
3
Objaśnienie kodu
Tutaj definiujemy zmienną, która będzie przechowywać wynik zwracany 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 2 podane przez nas parametry. Zauważ, że jest to pojedyncze wyrażenie. W treści funkcji lambda nie można pisać wielu instrukcji.
4. Wołamy funkcję i wypisujemy zwróconą wartość.
Przykład 2
To był podstawowy przykład pozwalający zrozumieć podstawy i składnię lambda. Spróbujmy teraz wydrukować lambdę i zobaczyć wynik. Ponownie otwórz IDLE i wpisz:
#What a lambda returnsstring='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ć.
Wynik:
at 0x00000185C3BF81E0>
Co tu się dzieje? Spójrzmy na kod, aby lepiej zrozumieć.
Objaśnienie kodu
- Tutaj definiujemy ciąg, który przekażesz jako parametr do lambda.
- Deklarujemy lambdę, która wywołuje instrukcję print i wyświetla wynik.
Ale dlaczego program nie wypisuje przekazanego nam ciągu? Dzieje się tak, ponieważ sama lambda zwraca obiekt funkcji. W tym przykładzie lambda nie jest wywoływana przez funkcję print, ale po prostu zwraca obiekt funkcji i lokalizację w pamięci, w której jest przechowywana. To jest drukowane na konsoli.
Przykład 3
Jeśli jednak napiszesz taki program:
#What a lambda returns #2x="some kind of a useless lambda"(lambda x : print(x))(x)
I uruchom go, naciskając klawisz F5, zobaczysz takie wyjście.
Wynik:
some kind of a useless lambda
Teraz wywoływana jest lambda, a przekazany przez nas łańcuch jest drukowany na konsoli. Ale co to za dziwna składnia i dlaczego definicję lambda ujęto w nawiasach? 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 wywołujemy ją natychmiast, przekazując ciąg jako argument. Jest to coś, co nazywa się IIFE, o czym dowiesz się więcej w kolejnych sekcjach tego samouczka.
Przykład 4
Spójrzmy na ostatni przykład, aby zrozumieć, w jaki sposób wykonywane są lambdy i zwykłe funkcje. Więc otwórz IDLE iw nowym pliku wpisz:
#A REGULAR FUNCTIONdef guru( funct, *args ):funct( *args )def printer_one( arg ):return print (arg)def printer_two( arg ):print(arg)#CALL A REGULAR FUNCTIONguru( printer_one, 'printer 1 REGULAR CALL' )guru( printer_two, 'printer 2 REGULAR CALL \n' )#CALL A REGULAR FUNCTION THRU A LAMBDAguru(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.
Wynik:
drukarka 1 ZWYKŁE POŁĄCZENIE
drukarka 2 ZWYKŁE POŁĄCZENIE
drukarka 1 LAMBDA CALL
drukarka 2 LAMBDA CALL
Objaśnienie kodu
- Funkcja zwana guru, która przyjmuje inną funkcję jako pierwszy parametr i wszelkie inne argumenty po niej.
- printer_one to prosta funkcja, która wyświetla przekazany mu parametr i zwraca go.
- printer_two jest podobna do printer_one, ale bez instrukcji return.
- W tej części wywołujemy funkcję guru i przekazujemy funkcje drukarki i łańcuch jako parametry.
- To jest składnia potrzebna do osiągnięcia czwartego kroku (tj. Wywołania funkcji guru), ale przy użyciu lambd.
W następnej sekcji dowiesz się, jak używać funkcji lambda z map (), redukuj () i filter () w Pythonie.
Używanie lambd z wbudowanymi funkcjami Pythona
Funkcje lambda zapewniają elegancki i potężny sposób wykonywania operacji przy użyciu wbudowanych metod w Pythonie. Jest to możliwe, ponieważ wyrażenia lambda można wywołać natychmiast i przekazać jako argument do tych funkcji.
IIFE w Pythonie Lambda
IIFE oznacza natychmiastowe wykonanie funkcji. Oznacza to, że funkcję lambda można wywołać, gdy tylko zostanie zdefiniowana. Zrozummy to na przykładzie; uruchom IDLE i wpisz:
(lambda x: x + x)(2)
Oto wyjście 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 używać tych funkcji.
lambdy w filtrze ()
Funkcja filtru służy do wybierania określonych elementów z sekwencji elementów. Sekwencja może być dowolnym iteratorem, takim jak listy, zbiory, krotki itp.
Elementy, które zostaną wybrane, są oparte na pewnym predefiniowanym ograniczeniu. Zajmuje 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]
Objaśnienie kodu:
1. W pierwszym stwierdzeniu definiujemy listę zwaną sekwencjami, która zawiera pewne liczby.
2. Tutaj deklarujemy zmienną o nazwie filter_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 prawdę, jeśli jest większa niż 4.
4. Wydrukuj wynik zwrócony przez funkcję filtrującą.
lambdy na mapie ()
funkcja map służy do zastosowania określonej operacji do każdego elementu w sekwencji. Podobnie jak filter (), przyjmuje również 2 parametry:
- Funkcja definiująca operację do wykonania na elementach
- Jedna lub więcej sekwencji
Na przykład, oto program, który wypisuje 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))
Wynik:
[100, 4, 64, 49, 25, 16, 121, 0, 1]
[KR1]
Objaśnienie kodu:
- Tutaj definiujemy listę zwaną sekwencjami, która zawiera pewne liczby.
- Deklarujemy zmienną o nazwie filter_result, która będzie przechowywać zmapowane wartości
- Funkcja lambda, która działa na każdym elemencie listy i zwraca kwadrat o tej liczbie.
- Wydrukuj wynik zwrócony przez funkcję map.
lambdy w zmniejszeniu ()
Funkcja redukcji, podobnie jak map (), służy do zastosowania operacji do każdego elementu w sekwencji. Jednak różni się od mapy sposobem działania. Oto kroki, po których następuje obliczenie wyniku przez funkcję redukuj ():
Krok 1) Wykonaj zdefiniowaną operację na pierwszych 2 elementach sekwencji.
Krok 2) Zapisz ten wynik
Krok 3) Wykonaj operację z zapisanym wynikiem i kolejnym elementem w sekwencji.
Krok 4) Powtarzaj, aż nie pozostanie więcej elementów.
Przyjmuje również dwa parametry:
- Funkcja definiująca operację do wykonania
- Sekwencja (dowolny iterator, taki jak listy, krotki itp.)
Na przykład, oto program, który zwraca iloczyn wszystkich elementów na liście:
from functools import reducesequences = [1,2,3,4,5]product = reduce (lambda x, y: x*y, sequences)print(product)
Oto wynik:
120
Objaśnienie kodu:
- Importuj redukuj z modułu functools
- Tutaj definiujemy listę zwaną sekwencjami, która zawiera pewne liczby.
- Deklarujemy zmienną o nazwie produkt, która będzie przechowywać zmniejszoną wartość
- Funkcja lambda, która działa na każdym elemencie listy. Zwróci iloczyn tej liczby zgodnie z poprzednim wynikiem.
- Wydrukuj wynik zwrócony przez funkcję redukuj.
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 ich unikać. W tej sekcji poznasz niektóre zasady projektowania używane przez programistów Pythona podczas pisania lambd.
Jednym z najczęstszych przypadków użycia lambd jest programowanie funkcjonalne, ponieważ Python obsługuje paradygmat (lub styl) programowania znany jako programowanie funkcjonalne.
Pozwala na udostępnienie funkcji jako parametru innej funkcji (na przykład w mapie, filtrze itp.). W takich przypadkach użycie lambd oferuje elegancki sposób tworzenia jednorazowej funkcji i przekazywania jej jako parametru.
Kiedy nie należy używać Lambda?
Nigdy nie powinieneś pisać skomplikowanych funkcji lambda w środowisku produkcyjnym. Koderom, którzy utrzymują Twój kod, będzie bardzo trudno go odszyfrować. Jeśli zauważysz, że tworzysz złożone wyrażenia jednowierszowe, znacznie lepszym sposobem byłoby zdefiniowanie właściwej funkcji. Zgodnie z najlepszą praktyką należy pamiętać, że prosty kod jest zawsze lepszy niż kod złożony.
Lambdy a funkcje regularne
Jak już wspomniano, lambdy są [vV4] [J5] po prostu funkcjami, które nie mają przypisanego identyfikatora. Mówiąc prościej, są to funkcje bez nazw (a więc anonimowe). Oto tabela ilustrująca różnicę między lambdami a zwykłymi funkcjami 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 treści wiele wyrażeń i instrukcji.
Z jagniętami nie jest skojarzona żadna nazwa. Dlatego nazywane są również funkcjami anonimowymi.
Zwykłe funkcje 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ą zwykłą polega na tym, że funkcja lambda oblicza tylko jedno wyrażenie i zwraca obiekt funkcji. W związku z tym możemy nazwać wynik funkcji lambda i użyć go w naszym programie, tak jak w poprzednim przykładzie.
Zwykła funkcja w powyższym przykładzie wyglądałaby następująco:
def adder (x, y):return x + yprint (adder (1, 2))
Tutaj musimy zdefiniować nazwę funkcji, która zwraca wynik, gdy ją wywołujemy . Funkcja lambda nie zawiera instrukcji return, ponieważ będzie miała tylko jedno wyrażenie, które jest zawsze zwracane domyślnie. 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 wbudowanymi funkcjami Pythona.
Jednak nadal możesz się zastanawiać, czym różnią się lambdy od funkcji zwracającej pojedyncze wyrażenie (jak to powyżej). Na poziomie tłumacza nie ma dużej różnicy. Może się to wydawać zaskakujące, ale każda funkcja lambda zdefiniowana w Pythonie jest traktowana przez interpreter jako normalna funkcja.
Jak widać na diagramie, obie definicje są obsługiwane w ten sam sposób przez interpreter języka Python po konwersji na kod bajtowy. Teraz nie możesz nazwać funkcji lambda, ponieważ jest ona zarezerwowana przez Pythona, ale każda inna nazwa funkcji da ten sam kod bajtowy [KR6].
Podsumowanie
- Lambdy, znane również jako funkcje anonimowe, to małe, ograniczone funkcje, które nie wymagają nazwy (tj. Identyfikatora).
- Każda funkcja lambda w Pythonie ma 3 zasadnicze części:
- Słowo kluczowe lambda.
- Parametry (lub zmienne powiązane) i
- Treść funkcji.
- Składnia do pisania lambdy to: lambda parametr: wyrażenie
- Lambdy mogą mieć dowolną liczbę parametrów, ale nie są ujęte w nawiasy klamrowe
- Treść funkcji lambda może mieć tylko jedno wyrażenie, które jest domyślnie zwracane.
- Na poziomie kodu bajtowego nie ma dużej różnicy między tym, jak lambdy i zwykłe funkcje są obsługiwane przez interpreter.
- Lambdy obsługują IIFE poprzez następującą składnię: (parametr lambda: wyrażenie) (argument)
- Lambdy są powszechnie używane z następującymi wbudowanymi funkcjami Pythona:
- Filtr: filtr (parametr lambda: wyrażenie, sekwencja iterowalna)
- Mapa: mapa (parametr lambda: wyrażenie, sekwencje iterowalne)
- Zmniejsz: zredukuj (parametr lambda1, parametr2: 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.