Przejdź do głównej treści
eLearner.app
Moduł 5 · Lekcja 4 z 420/36 w kursie~10 min
Lekcje modułu (4/4)

Lambda i funkcje wyższego rzędu

Wyrażenie lambda to funkcja anonimowa, zdefiniowana w jednej linii. Składnia:

Python
lambda parametri: espressione

Jest odpowiednikiem def, ale bardziej zwięzłym i dobrze dopasowanym do funkcji "jednorazowych" przekazywanych do innych funkcji.

Python
quadrato = lambda x: x ** 2
quadrato(5)    # 25

# equivalent to:
def quadrato(x):
    return x ** 2

Różnice vs def

Cechadeflambda
nazwawymaganaanonimowa
ciałowiele instrukcjiPOJEDYNCZE wyrażenie
returnjawneniejawne (wyrażenie)
docstringtaknie

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.

Python
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:

Python
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 age

Inne typowe zastosowania: min(...), max(...), filter(...), map(...).

Python
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

Ćwiczenie#python.m5.l4.e1
Próby: 0Ładowanie...

Mając daną listę `words = ['banana', 'kiwi', 'mela', 'fragola']`, posortuj ją po długości rosnąco do zmiennej `by_length`. Oceń `by_length`.

Ładowanie edytora...
Pokaż wskazówkę

key=len (lub lambda p: len(p)).

Rozwiązanie dostępne po 3 próbach

Ćwiczenie powtórzeniowe

Ćwiczenie#python.m5.l4.e2
Próby: 0Ładowanie...

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`.

Ładowanie edytora...
Pokaż wskazówkę

lambda p: p[1]

Rozwiązanie dostępne po 3 próbach

Dodatkowe wyzwanie

Ćwiczenie#python.m5.l4.e3
Próby: 0Ładowanie...

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ą.

Ładowanie edytora...
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