W tym poradniku zagłębimy się w świat funkcji lambda w języku Python. Zbadamy ich składnię, sposób definiowania oraz różnorodne zastosowania poparte konkretnymi przykładami kodu.
W Pythonie lambdy to anonimowe funkcje, charakteryzujące się zwięzłą formą zapisu. Można je efektywnie łączyć z innymi wbudowanymi funkcjami. Po lekturze tego artykułu będziesz wiedzieć, jak tworzyć funkcje lambda i kiedy warto z nich korzystać zamiast tradycyjnych funkcji Pythona.
Zaczynamy!
Funkcje lambda w Pythonie: Składnia i Przykłady
Poniżej przedstawiamy ogólną strukturę definicji funkcji lambda w Pythonie:
lambda argument(y): wartość_do_zwrócenia
W powyższym schemacie:
lambda
to słowo kluczowe, które rozpoczyna definicję funkcji lambda. Po nim umieszczamy jeden lub więcej argumentów, które funkcja przyjmuje.- Argumenty i wartość zwracana są rozdzielone dwukropkiem.
💡 Podczas tworzenia funkcji lambda, upewnij się, że wartość zwracana jest wynikiem pojedynczego wyrażenia, mieszczącego się w jednej linii kodu. Zrozumiesz to lepiej, analizując poniższe przykłady.
Przykłady praktycznego zastosowania funkcji lambda w Pythonie
Najlepszym sposobem na zrozumienie funkcji lambda jest przekształcenie standardowych funkcji Pythona w ich lambda odpowiedniki.
👩🏽💻 Zachęcamy do eksperymentowania z kodem w interpreterze Python REPL lub w dowolnym edytorze online, np. newsblog.pl.
#1. Przyjrzyjmy się funkcji square()
, która przyjmuje liczbę num
jako argument i zwraca jej kwadrat.
def square(num): return num*num
Możemy przetestować działanie funkcji, wywołując ją z różnymi argumentami:
>>> square(9) 81 >>> square(12) 144
Wyrażenie lambda możemy przypisać do zmiennej, np. kwadrat1
, co uprości definicję funkcji: kwadrat1 = lambda liczba: liczba*liczba
. Następnie można wywołać kwadrat1
z dowolną liczbą. Pamiętajmy jednak, że lambdy są anonimowe, dlatego nie powinniśmy ich przypisywać do zmiennych.
W funkcji square()
parametr to num
, a zwracana wartość to num*num
. Wykorzystując te elementy, możemy utworzyć wyrażenie lambda i wywołać je bezpośrednio z argumentem:
>>> (lambda num: num*num)(2) 4
To pokazuje koncepcję natychmiastowego wywołania funkcji, czyli wywołanie funkcji w momencie jej zdefiniowania.
#2. Przekształćmy teraz inną prostą funkcję add()
, która pobiera dwie liczby, num1
i num2
, i zwraca ich sumę: num1 + num2
.
def add(num1,num2): return num1 + num2
Przetestujmy funkcję add()
z różnymi parami liczb:
>>> 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
. Odpowiednik w lambda wygląda tak:
>>> (lambda num1, num2: num1 + num2)(3,7) 10
Funkcje w Pythonie mogą mieć domyślne wartości parametrów. Zmodyfikujmy teraz definicję funkcji add()
, ustawiając domyślną wartość parametru num2
na 10.
def add(num1, num2=10): return num1 + num2
W kolejnych wywołaniach funkcji:
- W pierwszym wywołaniu,
num1
wynosi 1, anum2
3. Przekazując wartośćnum2
podczas wywołania, ta wartość jest używana i funkcja zwraca 4.
- Jeśli jednak przekażemy tylko jeden argument (
num1
wynosi 7), domyślna wartość 10 zostanie użyta dlanum2
, a funkcja zwróci 17.
>>> add(1,3) 4 >>> add(7) 17
Podczas tworzenia funkcji lambda z domyślnymi wartościami parametrów, można określić wartość domyślną w definicji parametrów.
>>> (lambda num1, num2 = 10: num1 + num2)(1) 11
Kiedy używać funkcji lambda w Pythonie?
Teraz, gdy rozumiesz podstawy funkcji lambda w Pythonie, przedstawiamy kilka scenariuszy, w których są one szczególnie przydatne:
- Gdy masz funkcję, której wartość zwracana jest pojedynczym wyrażeniem i nie potrzebujesz odwoływać się do tej funkcji w innym miejscu tego samego modułu, możesz użyć lambdy. Przykłady tego typu zastosowań zaprezentowaliśmy wcześniej.
- Funkcje lambda są bardzo przydatne w połączeniu z funkcjami wbudowanymi, takimi jak
map()
,filter()
ireduce()
. - Lambdy mogą również ułatwić sortowanie struktur danych w Pythonie, takich jak listy i słowniki.
Jak używać funkcji Lambda z funkcjami wbudowanymi w Pythonie
1. Zastosowanie Lambdy z funkcją map()
Funkcja map()
pobiera funkcję i iterowalną (np. listę) i stosuje tę funkcję do każdego elementu iterowalnej:
Utwórzmy listę nums
i użyjmy map()
, aby stworzyć nową listę, zawierającą kwadraty każdej z liczb z listy nums
. Zwróć uwagę, jak lambda definiuje operację podnoszenia do kwadratu.
>>> nums = [4,5,6,9] >>> list(map(lambda num:num*num,nums)) [16, 25, 36, 81]
Ponieważ funkcja map()
zwraca obiekt mapy, musimy przekonwertować go na listę.
▶️ Sprawdź również nasz samouczek dotyczący funkcji map()
w Pythonie.
2. Użycie Lambdy z funkcją filter()
Zdefiniujmy listę liczb o nazwie nums
:
>>> nums = [4,5,6,9]
Załóżmy, że chcemy odfiltrować z tej listy tylko liczby nieparzyste.
Możemy w tym celu użyć wbudowanej funkcji filter()
.
Funkcja filter()
przyjmuje warunek i iterowalną: filter(warunek, iterowalna)
. Wynikiem są tylko te elementy oryginalnej iterowalnej, które spełniają warunek. Możemy przekonwertować zwrócony obiekt na listę.
Aby odfiltrować liczby parzyste, zachowamy tylko nieparzyste. Wyrażenie lambda powinno więc mieć postać lambda num: num%2!=0
. num%2
to reszta z dzielenia num
przez 2.
num%2!=0
jest prawdą, gdy liczba jest nieparzysta, oraznum%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. Zastosowanie Lambdy z funkcją reduce()
Funkcja reduce()
pobiera iterowalną i funkcję. Redukuje iterowalną, stosując funkcję iteracyjnie do jej elementów.
Aby użyć funkcji reduce()
, należy zaimportować ją z modułu functools
:
>>> from functools import reduce
Użyjmy funkcji reduce()
do obliczenia sumy wszystkich liczb z listy nums
. Definiujemy wyrażenie lambda lambda num1, num2: num1+num2
jako funkcję sumującą.
Operacja redukcji będzie wyglądać następująco: f(f(f(4,5),6),9) = f(f(9,6),9) = f(15,9) = 24. Tutaj f to operacja sumowania dwóch liczb z listy, zdefiniowana przez funkcję lambda.
>>> from functools import reduce >>> nums = [4,5,6,9] >>> reduce(lambda num1,num2:num1+num2,nums) 24
Funkcje Lambda w Pythonie do dostosowywania sortowania
Oprócz używania lambd z wbudowanymi funkcjami takimi jak map()
, filter()
i reduce()
, możemy ich używać do modyfikowania sposobu sortowania danych.
1. Sortowanie list w Pythonie
Często podczas pracy z listami, będziemy chcieli je posortować według określonych kryteriów. Do sortowania list w miejscu używamy metody sort()
, a gdy potrzebujemy posortowanej kopii listy, używamy funkcji sorted()
.
Składnia funkcji sorted()
to: sorted(iterowalna, key=…, reverse=True|False)
.
– Parametr key
służy do dostosowania sortowania.
– Parametr reverse
można ustawić na True
lub False
, domyślnie jest False
.
Podczas sortowania liczb i ciągów domyślne sortowanie jest odpowiednio w porządku rosnącym i alfabetycznym. Czasami jednak potrzebujemy sortowania niestandardowego.
Rozważmy listę fruits
. Załóżmy, że chcemy uzyskać posortowaną kopię listy, gdzie łańcuchy będą posortowane według liczby wystąpień litery „p” w każdym z nich, w porządku malejącym.
>>> fruits = ['apple','pineapple','grapes','mango']
Wykorzystamy tutaj opcjonalny parametr key
. Ciąg znaków w Pythonie jest iterowalny, a aby uzyskać liczbę wystąpień znaku, możemy użyć wbudowanej metody .count()
. Ustawiamy więc parametr key
na lambda x: x.count('p')
, aby sortowanie odbywało się według liczby wystąpień 'p’ w każdym 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 sortowania jest liczba wystąpień znaku „p”, którą zdefiniowaliśmy jako wyrażenie lambda.
- Ponieważ parametr
reverse
jest ustawiony naTrue
, sortowanie odbywa się w porządku malejącym liczby wystąpień „p”.
Na liście fruits
słowo „pineapple” zawiera 3 wystąpienia „p”, natomiast „apple”, „grapes” i „mango” zawierają odpowiednio 2, 1 i 0 wystąpień litery „p”.
Zrozumienie stabilnego sortowania
Rozważmy inny przykład. Dla tego samego kryterium sortowania, zdefiniowaliśmy na nowo listę fruits
. Teraz „p” występuje w ciągach „apple” i „grapes” odpowiednio dwa i jeden raz, natomiast nie występuje w „mango” i „melon”.
>>> fruits = ['mango','apple','melon','grapes'] >>> sorted(fruits,key=lambda x:x.count('p'),reverse=True) ['apple', 'grapes', 'mango', 'melon']
Na wyjściu „mango” pojawia się przed „melonem”, pomimo tego że oba nie mają litery „p”. Dlaczego tak się dzieje? Funkcja sorted()
wykonuje stabilne sortowanie, a to oznacza, że gdy liczba „p” jest taka sama dla dwóch ciągów, kolejność elementów z oryginalnej listy jest zachowywana.
W ramach ćwiczenia zmień pozycje „mango” i „melon” na liście fruits
, posortuj listę według tego samego kryterium i sprawdź wyniki.
▶️ Dowiedz się więcej o sortowaniu list w Pythonie.
2. Sortowanie słowników w Pythonie
Możemy również używać lambd podczas sortowania słowników w Pythonie. Rozważmy słownik price_dict
, zawierający elementy i ich ceny.
>>> price_dict = { ... 'Milk':10, ... 'Honey':15, ... 'Bread':7, ... 'Candy':3 ... }
Aby uzyskać pary klucz-wartość słownika jako listę krotek, użyjmy wbudowanej metody .items()
:
>>> price_dict_items = price_dict.items() dict_items([('Milk', 10), ('Honey', 15), ('Bread', 7), ('Candy', 3)])
W Pythonie wszystkie iterowalne, jak listy, krotki i ciągi, są indeksowane od zera. Pierwszy element jest na pozycji 0, drugi na pozycji 1, itd.
Chcemy posortować elementy według wartości, czyli ceny każdego z nich. W każdej krotce na liście price_dict_items
pozycja o indeksie 1 to cena. Ustawiamy więc parametr key
na lambda x:x[1]
, aby sortowanie odbyło się według ceny.
>>> dict(sorted(price_dict_items,key=lambda x:x[1])) {'Candy': 3, 'Bread': 7, 'Milk': 10, 'Honey': 15}
Na wyjściu elementy słownika zostały posortowane rosnąco według ceny, od „Candy” za 3, do „Honey” za 15.
▶️ Aby dowiedzieć się więcej, zapoznaj się z naszym szczegółowym przewodnikiem na temat sortowania słowników Pythona według klucza i wartości.
Podsumowanie
Gratulacje! Poznałeś definicję funkcji lambda oraz sposób ich efektywnego wykorzystania z innymi wbudowanymi funkcjami Pythona. Oto najważniejsze wnioski z tego poradnika:
- Lambdy w Pythonie są anonimowymi funkcjami, które mogą przyjmować wiele argumentów i zwracać wartość. Wyrażenie obliczające tę wartość powinno zmieścić się w jednej linii kodu. Lambdy mogą być używane do zwięzłego definiowania małych funkcji.
- Aby utworzyć funkcję lambda, użyj składni:
lambda argument(y): wartość_do_zwrócenia
. - Lambdy są szczególnie przydatne w połączeniu z funkcjami
map()
,filter()
ireduce()
, a także jako parametrkey
podczas dostosowywania sortowania iterowalnych struktur danych.
Teraz możesz dowiedzieć się więcej o dzieleniu całkowitoliczbowym w Pythonie.