Rozdział 13 · Automatyzacja z funkcjami

Funkcje lambda

Mały, nienazwany obiekt funkcji dla pojedynczego wyrażenia jest przydatny w wąskich przypadkach, a nie jako nowocześniejszy zamiennik def.

W §13.20 opublikowaliśmy len jako argument w sorted(). A co, jeśli potrzebna reguła sortowania nie istnieje jako gotowa funkcja — i zakładać osobną dla niej def wydaje się zbędne? Jest lambda.

lambda tworzy mały, nienazwany obiekt funkcji

lambda_sortirovka.py
students = [{"name": "Anna", "score": 82}, {"name": "Bob", "score": 95}]
students.sort(key=lambda student: student["score"])
Nie „krótszy def”
Głównym zadaniem lambda jest przekazanie małej reguły/transformacji do miejsca, gdzie pełnoprawna nazwana funkcja byłaby zbędna. To NIE jest nowsze zastępstwo def jest osobnym narzędziem dla wąskiego przypadku.

Anatomia lambda

lambda_anatomiya.py
lambda x: x ** 2
CzęśćZnaczenie
lambdasłowem kluczowym jest utworzenie funkcji wyrażenia
xparametr (bez nawiasów)
x ** 2pojedynczym wyrażeniu jego wynik jest automatycznie zwracany
lambda_vyzov.py
kvadrat = lambda x: x ** 2
print(kvadrat(5))   # 25

Brak wyraźnych informacji return i brak instrukcji blokowych w środku — Tylko jedno wyrażenie.

Ograniczenia lambda

Gdy lambda NIE JEST odpowiednia, należy def
Tylko ekspresja
żadnych instrukcji
ani przypisania, ani print
Nie dla logiki złożonej
rozgałęzienia z efektami
długie obliczenia
Bez Name i Dockstring
nie ma nic do pokazania w traceback
nic do dokumentowania
Jeśli logika zasługuje na nazwę — użyj def
Gdy reguła stanie się na tyle ważna, że warto ją ponownie stosować, testować osobno lub dokumentować, czas przekształcić lambda w stałą funkcję z def.

def → lambda: porównanie stylu, a nie „ulepszenie”

Prosta funkcja: def → lambda
Zwykła funkcja (def)
def kvadrat(x):
    return x ** 2

print(kvadrat(5))
Funkcja lambda
kvadrat = lambda x: x ** 2

print(kvadrat(5))
Co używać dzisiaj: zwykła funkcja z def jest czytelniejsza, ma zwykłą nazwę do debugowania i łatwo dodać kilka linii logiki lub komentarza. lambda wygodne tylko dla jednego krótkiego wiersza bez nazwy — na przykład jako argument funkcji sorted() lub max(). Przypisanie lambda imienia (kvadrat = lambda x: ...) nie jest bardziej „nowoczesny” def – w wielu prawdziwych projektach ten styl byłby uważany za mniej czytelny, a nie progresywny.

Opcjonalnie: map() i filter()

Skoro już znasz comprehensions (rozdział 11), warto zobaczyć ich alternatywę:

map_primer.py
numbers = [1, 2, 3, 4]
kvadraty = list(map(lambda n: n ** 2, numbers))
print(kvadraty)
comprehension_ekvivalent.py
numbers = [1, 2, 3, 4]
kvadraty = [n ** 2 for n in numbers]
print(kvadraty)
filter_primer.py
chetnye = list(filter(lambda n: n % 2 == 0, numbers))
comprehension_s_if.py
chetnye = [n for n in numbers if n % 2 == 0]
Python częściej woli comprehensions
Dla prostych transformacji i filtrów comprehension zwykle jest czytelniejszy niż map()/filter() z lambda. Znajomość obu stylów jest pomocna — oba znajdziesz w prawdziwym kodzie — ale domyślnie sięgnij po comprehension, jeśli zadanie jest proste.
Praktyka: funkcje lambda
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →