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().

  • 🔑 Słowo kluczowe Lambda: Lambdę zapisuje się jako argumenty lambda: wyrażenie, bez definicji, bez nazwy i bez jawnego polecenia return.
  • 🧮 Pojedyncze wyrażenie: Treść zawiera dokładnie jedno wyrażenie, którego wartość jest zwracana automatycznie, dlatego nie są dozwolone żadne instrukcje ani wiele wierszy.
  • 🔗 Wbudowane parowanie: Wyrażenia lambda są zwykle przekazywane do map(), filter(), reduce() i sorted() w celu przekształcenia lub wybrania elementów w sekwencji.
  • IIFE: Funkcję lambda można zdefiniować i wywołać natychmiast, korzystając ze wzorca (lambda x: x + x)(2), zwracając wynik od razu.
  • ⚖️. Przeciwko def: Zwykłe funkcje wymagają nazwy i mogą zawierać wiele poleceń, natomiast lambdy wykorzystują tę samą funkcjonalność, oferując zwartą, jednowierszową składnię.
  • 🤖 Pomoc AI: Asystenci AI, np. GitHub Copilot, generują wyrażenia lambda dla kluczy mapy, filtra i sortowania na podstawie krótkiego monitu.

Python Funkcje lambda

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:

  1. Funkcja definiująca operację, która ma zostać wykonana na elementach
  2. 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:

  1. Funkcja definiująca operację, która ma zostać wykonana
  2. 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.

FAQ

Tak. Lambda może używać wyrażenia warunkowego, takiego jak lambda x: 'even' if x % 2 == 0 else 'odd'. Nie może zawierać pełnego wyrażenia if, ponieważ treść lambdy musi być pojedynczym wyrażeniem, a nie blokiem wyrażeń.

Generalnie nie. PEP 8 zaleca używanie def, gdy funkcja potrzebuje nazwy, ponieważ powiązanie lambdy ze zmienną nadaje jej nazwę, ale traci jej przejrzystość. traceback, który def zapewnia. Lambdy najlepiej przekazywać bezpośrednio do funkcji takich jak sorted(), map() lub filter().

Nie. Na poziomie kodu bajtowego Python traktuje lambdę i równoważną funkcję def tak samo, więc nie ma przewagi szybkości. Lambda oszczędza jedynie linijkę kodu; nie wykonuje się szybciej niż nazwana funkcja wykonująca identyczną pracę.

Tak. Lambda może odczytywać zmienne z zakresu otaczającego, tworząc domknięcie. Wewnątrz pętli należy zachować ostrożność: lambda przechwytuje samą zmienną, a nie jej bieżącą wartość, dlatego należy użyć domyślnego argumentu, takiego jak lambda x, n=n: x + n, aby ją zamrozić.

Przekaż lambdę jako argument kluczowy do sorted() lub list.sort(). Na przykład sorted(users, key=lambda u: u['age']) sortuje elementy według wieku. Lambda informuje Python jaką wartość porównać dla każdego elementu, zapewniając zwięzłe, niestandardowe sortowanie bez konieczności używania oddzielnej nazwanej funkcji.

Nie bezpośrednio, ponieważ anonimowa lambda nie ma nazwy, do której można się odwołać. Można to obejść, przypisując lambdę do zmiennej i wywołując tę ​​nazwę, ale normalna funkcja def jest bardziej przejrzystym i zalecanym wyborem w przypadku rekurencji.

Lambdy umożliwiają szybkie, liniowe transformacje w kodzie AI i uczenia maszynowego. Analitycy danych przekazują je do funkcji .apply(), map() i filter() w Pandas, aby oczyścić lub przekształcić dane, a także jako kluczowe funkcje sortowania.ping wstępne przetwarzanie kompaktowe wewnątrz większych kanałów szkoleniowych.

GitHub Copilot sugeruje kompletne wyrażenia lambda na podstawie krótkiego komentarza lub otaczającego kodu, w tym poprawne parametry i wyrażenia dla wywołań map(), filter() lub sorted(). Może również zaproponować konwersję rozbudowanej lambdy na bardziej czytelną funkcję nazwaną, gdy liczy się czytelność.

Podsumuj ten post następująco: