Menu

Lambda w Pythonie: funkcje anonimowe, klucz sortowania i map/filter

Czym jest lambda, do czego się nadaje i w których kilku miejscach naprawdę się opłaca, a także kiedy lepiej sięgnąć po nazwaną funkcję.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Funkcja, której nie chce ci się nazywać

Większość funkcji w Pythonie definiuje się przez def, mają nazwy i leżą w pliku, gdzie można ich używać wielokrotnie. lambda to mniejsza, bezimienna alternatywa, przydatna w tych kilku przypadkach, w których pełna definicja funkcji byłaby większą ceremonią, niż jest warta.

Oto obie formy obok siebie:

Dwie funkcje, które robią dokładnie to samo. Wersja z lambdą mieści się w jednej linii, bo to w zasadzie jej zadanie: jednorazowa funkcja na jednorazową chwilę.

Składnia

lambda <params>: <expression>

  • <params> to ta sama lista parametrów, której użyłby def: obsługuje wartości domyślne, *args i **kwargs.
  • <expression> to jedno wyrażenie, którego wartość staje się wartością zwracaną.

Przykłady:

Nie ma słowa kluczowego return. Wartość wyrażenia jest zwracana automatycznie.

Jedyne ograniczenie

Lambda może zawierać tylko jedno wyrażenie. Nie da się w niej umieścić instrukcji:

Możesz za to użyć wyrażenia warunkowego:

Jeśli potrzebujesz więcej niż jednego wyrażenia, to sygnał, żeby przejść na def.

Gdzie lambdy naprawdę się opłacają

Lambda przypisana do zmiennej prawie zawsze jest gorsza niż nazwany def:

To zdecydowanie gorsze niż def double(x): return x * 2: czytelność ta sama, a do tego wersja z lambdą pokazuje w śladzie stosu mało pomocną nazwę <lambda>.

Lambdy błyszczą dokładnie w jednym miejscu: jako argumenty wpisane bezpośrednio w wywołanie funkcji wyższego rzędu.

Własne klucze sortowania

Klasyczny przypadek:

Argument key funkcji sorted oczekuje funkcji, która przyjmuje element i zwraca wartość, według której sortujemy. Jednolinijkowa lambda pasuje tu idealnie, a pełny def byłby zbyt ciężki na coś tak małego.

Możesz sortować po kilku polach, używając krotki:

min, max, filter, map

Podobna historia: wszystkie przyjmują opcjonalny argument w postaci funkcji:

Zamiast map i filter zwykle jeszcze czytelniejsza jest list comprehension:

Z tego powodu większość programistów Pythona wybiera comprehensions zamiast map/filter. lambda pozostaje naturalnym wyborem dla sorted, min i max, gdzie comprehension nie daje skrótu.

Lambdy i moduł operator

Gdy twoja lambda tylko "wyciąga klucz" albo "wyciąga atrybut", moduł operator w Pythonie ma szybsze i czytelniejsze alternatywy:

To niewielki zysk, ale w kodzie, który już importuje operator, czyta się to nieco bardziej deklaratywnie.

Kiedy wrócić do def

Jeśli spełniony jest którykolwiek z tych warunków, napisz def:

  1. Logika nie mieści się zgrabnie w jednym wyrażeniu.
  2. Chcesz nazwać funkcję, bo nazwa poprawi czytelność.
  3. Używasz tej samej logiki w więcej niż jednym miejscu.
  4. Funkcja potrzebuje docstringa (lambda nie może go mieć).

Pamiętaj: w Pythonie nikt nie przyznaje punktów za liczbę linii. Gdy logika przestaje być banalna, trzylinijkowa nazwana funkcja prawie zawsze czyta się lepiej niż jednolinijkowa lambda.

Dalej: dekoratory

Lambdy przekazują funkcje jako wartości. Dekoratory idą o krok dalej: pozwalają opakować dowolną funkcję w zachowanie wielokrotnego użytku (logowanie, pomiar czasu, cache, autoryzację) za pomocą jednego @ w linii nad nią. O tym jest następna strona.

Najczęściej zadawane pytania

Czym jest lambda w Pythonie?

lambda to krótka, anonimowa funkcja, którą możesz zapisać w jednej linii. lambda x: x * 2 działa tak samo jak def double(x): return x * 2, tylko nie ma nazwy. Najbardziej przydaje się wtedy, gdy potrzebujesz malutkiej funkcji jako argumentu innej funkcji.

Kiedy używać lambda zamiast def?

Używaj lambda do jednorazowych funkcji z jednym wyrażeniem, które przekazujesz bezpośrednio do czegoś w rodzaju sorted, max czy filter. Do wszystkiego, co ma dłuższe ciało niż jedno wyrażenie, albo co warto nazwać, używaj def. Nazwane funkcje prawie zawsze są czytelniejsze.

Jakie ograniczenia ma lambda?

Lambda może zawierać tylko jedno wyrażenie, a nie instrukcje. Nie ma w niej przypisań, bloków if (choć możesz użyć wyrażenia warunkowego a if cond else b) ani logiki na wiele linii. Jeśli walczysz z tymi ograniczeniami, przejdź na def.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ