Lekcje modułu (4/4)
Lambda i funkcje wyższego rzędu
Wyrażenie lambda to funkcja anonimowa, zdefiniowana w jednej linii. Składnia:
lambda parametri: espressioneJest odpowiednikiem def, ale bardziej zwięzłym i dobrze dopasowanym do funkcji
"jednorazowych" przekazywanych do innych funkcji.
quadrato = lambda x: x ** 2
quadrato(5) # 25
# equivalent to:
def quadrato(x):
return x ** 2Różnice vs def
| Cecha | def | lambda |
|---|---|---|
| nazwa | wymagana | anonimowa |
| ciało | wiele instrukcji | POJEDYNCZE wyrażenie |
| return | jawne | niejawne (wyrażenie) |
| docstring | tak | nie |
Brak return wewnątrz lambdy: wartość wyrażenia JEST wynikiem.
Kiedy używać lambdy
Prawie zawsze: jako argument key dla funkcji sortujących lub filtrujących.
parole = ["banana", "kiwi", "mela", "fragola"]
sorted(parole, key=len)
# ['kiwi', 'mela', 'banana', 'fragola']Zapis key=len mówi sorted: "aby porównać dwa elementy, użyj ich długości". Dla
własnych kryteriów użyj lambdy:
utenti = [
{"nome": "Ada", "eta": 36},
{"nome": "Linus", "eta": 54},
{"nome": "Grace", "eta": 85},
]
per_eta = sorted(utenti, key=lambda u: u["eta"])
# sorted by ascending ageInne typowe zastosowania: min(...), max(...), filter(...), map(...).
nums = [-3, 1, -4, 1, -5, 9]
max(nums, key=lambda n: abs(n)) # -5 (maximum by absolute value)Funkcje wyższego rzędu
Funkcja jest wyższego rzędu, jeśli przyjmuje funkcję jako argument lub ją
zwraca. Funkcje sorted, max, filter, map są funkcjami wyższego rzędu. Lambda
istnieje właśnie po to, aby ułatwić wywoływanie funkcji wyższego rzędu.
Kiedy unikać funkcji lambda
Funkcje lambda są przydatne do krótkich, jednorazowych operacji (takich jak szybkie sortowanie). Jeśli jednak przypisujesz lambdę do zmiennej (np. double = lambda x: x * 2), ogólnie zaleca się użycie standardowego bloku def ze względu na czytelność i ułatwienie debugowania (funkcje zdefiniowane za pomocą def zachowują swoje rzeczywiste nazwy w śladach błędów - tracebacks).
Spróbuj sam
Mając daną listę `words = ['banana', 'kiwi', 'mela', 'fragola']`, posortuj ją po długości rosnąco do zmiennej `by_length`. Oceń `by_length`.
Pokaż wskazówkę
key=len (lub lambda p: len(p)).
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
Mając daną listę krotek `points = [(1, 5), (3, 2), (2, 4)]`, posortuj je po DRUGIM elemencie rosnąco i przypisz do zmiennej `by_y`. Oceń `by_y`.
Pokaż wskazówkę
lambda p: p[1]
Rozwiązanie dostępne po 3 próbach
Dodatkowe wyzwanie
Zdefiniuj anonimową funkcję `lambda`, która przyjmuje liczbę `x` i zwraca `True`, jeśli liczba jest parzysta, a `False` w przeciwnym razie. Przypisz lambdę do zmiennej `is_even` i przetestuj ją wywołaniem `is_even(8)` jako ostatnią linią.
Pokaż wskazówkę
Napisz is_even = lambda x: x % 2 == 0 a następnie wywołaj is_even(8).
Rozwiązanie dostępne po 3 próbach