Jak używać funkcji lambda w Pythonie [With Examples]

W tym samouczku dowiesz się wszystkiego o funkcjach lambda w Pythonie – od składni do definiowania funkcji lambda po różne przypadki użycia z przykładami kodu.

W Pythonie lambdy są anonimowymi funkcjami, które mają zwięzłą składnię i mogą być używane z innymi pomocnymi funkcjami wbudowanymi. Pod koniec tego samouczka dowiesz się, jak definiować funkcje lambda i kiedy powinieneś rozważyć ich użycie zamiast zwykłych funkcji Pythona.

Zaczynajmy!

Funkcja lambda Pythona: składnia i przykłady

Oto ogólna składnia do definiowania funkcji lambda w Pythonie:

lambda parameter(s):return value

W powyższej ogólnej składni:

  • lambda to słowo kluczowe, którego należy użyć do zdefiniowania funkcji lambda, po której następuje jeden lub więcej parametrów, które funkcja powinna przyjąć.
  • Parametry i zwracaną wartość oddziela dwukropek.

💡 Definiując funkcję lambda, należy upewnić się, że wartość zwracana jest obliczana przez obliczenie wyrażenia, które obejmuje pojedynczy wiersz kodu. Zrozumiesz to lepiej, gdy będziemy kodować przykłady.

Przykłady funkcji lambda w Pythonie

Najlepszym sposobem zrozumienia funkcji lambda jest przepisanie zwykłych funkcji Pythona na funkcje lambda.

👩🏽‍💻 Możesz kodować w Pythonie REPL lub w internetowym edytorze Pythona newsblog.pl.

#1. Rozważmy następującą funkcję square(), która jako argument przyjmuje liczbę num i zwraca kwadrat tej liczby.

def square(num):
    return num*num

Możesz wywołać funkcję z argumentami i sprawdzić, czy działa poprawnie.

>>> square(9)
81
>>> square(12)
144

Możesz przypisać to wyrażenie lambda do nazwy zmiennej, powiedzmy, kwadrat1, aby definicja funkcji była bardziej zwięzła: kwadrat1 = lambda liczba: liczba*liczba, a następnie wywołaj funkcję kwadrat1 z dowolną liczbą jako argumentem. Wiemy jednak, że lambdy są funkcjami anonimowymi, dlatego należy unikać przypisywania ich do zmiennej.

W przypadku funkcji square() parametr to num, a zwracana wartość to num*num. Po ich zidentyfikowaniu możemy je podłączyć do wyrażenia lambda i wywołać je argumentem, jak pokazano:

>>> (lambda num: num*num)(2)
4

Jest to koncepcja natychmiastowego wyrażenia funkcji, w której wywołujemy funkcję zaraz po jej zdefiniowaniu.

#2. Następnie przepiszmy kolejną prostą funkcję add(), która pobiera liczby, num1 i num2, i zwraca ich sumę, num1 + num2.

def add(num1,num2):
    return num1 + num2

Wywołajmy funkcję add() z dwiema liczbami jako argumentami:

>>> add(4,3)
7
>>> add(12,5)
17
>>> add(12,6)
18

W tym przypadku num1 i num2 to dwa parametry, a zwracana wartość to num1 + num2.

>>> (lambda num1, num2: num1 + num2)(3,7)
10

Funkcje Pythona mogą również przyjmować domyślne wartości parametrów. Zmodyfikujmy definicję funkcji add() i ustawmy domyślną wartość parametru num2 na 10.

def add(num1, num2=10):
    return num1 + num2

W następujących wywołaniach funkcji:

  • W pierwszym wywołaniu funkcji wartość num1 to 1, a wartość num2 to 3. Kiedy przekazujesz wartość num2 w wywołaniu funkcji, ta wartość jest używana; funkcja zwraca 4.
  • Jeśli jednak przekażesz tylko jeden argument (num1 to 7), domyślna wartość 10 jest używana dla num2; funkcja zwraca 17.
>>> add(1,3)
4
>>> add(7)
17

Podczas pisania funkcji, które przyjmują wartości domyślne dla niektórych parametrów jako wyrażenia lambda, można określić wartość domyślną podczas definiowania parametrów.

>>> (lambda num1, num2 = 10: num1 + num2)(1)
11

Kiedy należy używać funkcji lambda w Pythonie?

Teraz, gdy znasz już podstawy funkcji lambda w Pythonie, oto kilka przypadków użycia:

  • Jeśli masz funkcję, której wyrażenie zwracane jest pojedynczym wierszem kodu i nie musisz odwoływać się do funkcji w innym miejscu w tym samym module, możesz użyć funkcji lambda. Aby to zrozumieć, zakodowaliśmy również kilka przykładów.
  • Możesz używać funkcji lambda podczas korzystania z funkcji wbudowanych, takich jak map(), filter() i Reduce().
  • Funkcje lambda mogą być pomocne w sortowaniu struktur danych Pythona, takich jak listy i słowniki.

Jak używać Pythona Lambda z wbudowanymi funkcjami

1. Używanie Lambdy z map()

Funkcja map() przyjmuje iterowalną i funkcję i stosuje ją do każdego elementu w iterowalnym, jak pokazano:

Stwórzmy listę nums i użyjmy funkcji map(), aby utworzyć nową listę zawierającą kwadrat każdej liczby na liście nums. Zwróć uwagę na użycie funkcji lambda do zdefiniowania operacji do kwadratu.

>>> nums = [4,5,6,9]
>>> list(map(lambda num:num*num,nums))
[16, 25, 36, 81]

Ponieważ funkcja map() zwraca obiekt mapy, powinniśmy rzutować go na listę.

▶️ Sprawdź samouczek dotyczący funkcji map() w Pythonie.

2. Używanie Lambdy z filter()

Zdefiniujmy liczby, listę liczb:

>>> nums = [4,5,6,9]

Załóżmy, że chcesz przefiltrować tę listę i zachować tylko liczby nieparzyste.

Możesz użyć wbudowanej w Pythona funkcji filter().

Funkcja filter() przyjmuje warunek i iterowalną: filter(warunek, iterowalność). Wynik zawiera tylko te elementy oryginalnej iteracji, które spełniają warunek. Możesz rzutować zwrócony obiekt do iterowalnego Pythona, takiego jak lista.

Aby odfiltrować wszystkie liczby parzyste, zachowamy tylko liczby nieparzyste. Zatem wyrażenie lambda powinno mieć postać lambda num: num%2!=0. Ilość num%2 to reszta z dzielenia num przez 2.

  • num%2!=0 to prawda, gdy liczba jest nieparzysta i
  • liczba%2!=0 jest fałszem, gdy liczba jest parzysta.
>>> nums = [4,5,6,9]
>>> list(filter(lambda num:num%2!=0,nums))
[5, 9]

3. Używanie Lambdy z Reduce()

Funkcja Reduce() przyjmuje iterację i funkcję. Zmniejsza iterację przez zastosowanie funkcji iteracyjnie na elementach iterowalności.

Aby użyć funkcji Reduce(), musisz zaimportować ją z wbudowanego modułu functools Pythona:

>>> from functools import reduce

Użyjmy funkcji Reduce(), aby obliczyć sumę wszystkich liczb z listy nums. Definiujemy wyrażenie lambda: lambda num1,num2:num1+num2, jako funkcję sumy redukującej.

Operacja redukcji będzie wyglądać tak: f(f(f(4,5),6),9) = f(f(9,6),9) = f(15,9) = 24. Tutaj f jest operacja sumowania na dwóch pozycjach listy, zdefiniowanych przez funkcję lambda.

>>> from functools import reduce
>>> nums = [4,5,6,9]
>>> reduce(lambda num1,num2:num1+num2,nums)
24

Funkcje lambda Pythona do dostosowywania sortowania

Oprócz używania funkcji lambda z wbudowanymi funkcjami Pythona, takimi jak map(), filter() i Reduce(), możesz ich również używać do dostosowywania wbudowanych funkcji i metod używanych do sortowania.

1. Sortowanie list Pythona

Podczas pracy z listami Pythona często będziesz musiał je posortować w oparciu o określone kryteria sortowania. Aby posortować listy Pythona w miejscu, możesz użyć na nich wbudowanej metody sort(). Jeśli potrzebujesz posortowanej kopii listy, możesz użyć funkcji sorted().

Składnia do użycia funkcji sorted() Pythona jest sorted(iterable, key=…,reverse= True | False).

– Kluczowy parametr służy do dostosowania sortowania.
– Parametr reverse można ustawić na True lub False; wartość domyślna to False.

Podczas sortowania list liczb i ciągów domyślne sortowanie odbywa się odpowiednio w kolejności rosnącej i alfabetycznej. Czasami jednak możesz chcieć zdefiniować niestandardowe kryterium sortowania.

Rozważ poniższą listę owoców. Załóżmy, że chcesz otrzymać posortowaną kopię listy. Należy posortować łańcuchy według liczby wystąpień w nich „p” – w kolejności malejącej.

>>> fruits = ['apple','pineapple','grapes','mango']

Czas użyć opcjonalnego parametru klucza. Ciąg znaków jest w Pythonie iterowalny i aby uzyskać liczbę wystąpień w nim znaku, możesz użyć wbudowanej metody .count(). Ustawiamy więc klucz na lambda x:x.count(’p’), aby sortowanie było oparte na liczbie wystąpień 'p’ w ciągu.

>>> fruits = ['apple','pineapple','grapes','mango']
>>> sorted(fruits,key=lambda x:x.count('p'),reverse=True)
['pineapple', 'apple', 'grapes', 'mango']

W tym przykładzie:

  • Kluczem do sortowania jest liczba wystąpień znaku „p”, który jest zdefiniowany jako wyrażenie lambda.
  • Ponieważ ustawiliśmy parametr reverse na True, sortowanie odbywa się w kolejności malejącej liczby wystąpień „p”.

Na liście owoców słowo „ananas” zawiera 3 wystąpienia „p”, a ciągi „jabłko”, „winogrona” i „mango” zawierają odpowiednio 2, 1 i 0 wystąpień „p”.

Zrozumienie stabilnego sortowania

Rozważ inny przykład. Dla tego samego kryterium sortowania przedefiniowaliśmy listę owoców. Tutaj „p” występuje w ciągach „jabłko” i „winogrona” odpowiednio dwa razy i raz. I nigdy nie występuje w smyczkach „mango” i „melon”.

>>> fruits = ['mango','apple','melon','grapes']
>>> sorted(fruits,key=lambda x:x.count('p'),reverse=True)
['apple', 'grapes', 'mango', 'melon']

Na liście wyjściowej „mango” pojawia się przed „melonem”, mimo że oba nie mają znaku „p”. Ale dlaczego tak jest? Funkcja sorted() wykonuje stabilne sortowanie; więc gdy liczba 'p’ jest równa dla dwóch ciągów, kolejność elementów w oryginalnej liście owoców jest zachowana.

W ramach szybkiego ćwiczenia zamień pozycje „mango” i „melon” na liście owoców, posortuj listę według tego samego kryterium i obserwuj wyniki.

▶️ Dowiedz się więcej o sortowaniu list Pythona.

2. Sortowanie słownika Pythona

Możesz także używać lambd podczas sortowania słowników Pythona. Rozważmy następujący słownik price_dict zawierający pozycje i ich ceny.

>>> price_dict = {
... 'Milk':10,
... 'Honey':15,
... 'Bread':7,
... 'Candy':3
... }

Aby uzyskać pary klucz-wartość słownika jako listę krotek, możesz użyć wbudowanej metody słownikowej .items():

>>> price_dict_items = price_dict.items()
dict_items([('Milk', 10), ('Honey', 15), ('Bread', 7), ('Candy', 3)])

W Pythonie wszystkie iterowalne: listy, krotki, ciągi i inne, są zgodne z indeksowaniem zerowym. Tak więc pierwsza pozycja jest pod indeksem 0, druga pod indeksem 1 i tak dalej.

Chcielibyśmy posortować według wartości, czyli ceny każdego elementu w słowniku. W każdej krotce na liście price_dict_items pozycja o indeksie 1 jest ceną. Ustawiamy więc klucz na lambda x:x[1] ponieważ użyje pozycji o indeksie 1, cenie, aby posortować słownik.

>>> dict(sorted(price_dict_items,key=lambda x:x[1]))
{'Candy': 3, 'Bread': 7, 'Milk': 10, 'Honey': 15}

Na wyjściu pozycje słownika zostały posortowane rosnąco według cen: zaczynając od „Cukierki”, w cenie 3 jednostki, do „Miód”, w cenie 15 jednostek.

▶️ Aby dowiedzieć się więcej, zapoznaj się z tym szczegółowym przewodnikiem na temat sortowania słownika Pythona według klucza i wartości.

Podsumowując

I masz to! Nauczyłeś się definiować funkcje lambda i efektywnie ich używać z innymi wbudowanymi funkcjami Pythona. Oto podsumowanie najważniejszych wniosków:

  • W Pythonie lambdy są anonimowymi funkcjami, które mogą przyjmować wiele argumentów i zwracać wartość; wyrażenie, które ma zostać ocenione w celu wygenerowania tej zwracanej wartości, powinno mieć jeden wiersz kodu. Mogą być używane do zwięzłości definicji małych funkcji.
  • Aby zdefiniować funkcję Lambda, możesz użyć składni: parametr(y) lambda: zwracana wartość.
  • Niektóre z ważnych przypadków użycia obejmują używanie ich z funkcjami map(), filter() i Reduce() oraz jako kluczowego parametru do dostosowywania sortowania iteracji Pythona.

Następnie dowiedz się, jak przeprowadzić podział pięter w Pythonie.