❄️ Funkcje anonimowe - lambda
Funkcje anonimowe - lambda
Są to krótkie, anonimowe funkcje, które można definiować bez nadawania im nazwy. Służą one głównie do wykonywania prostych operacji, zwłaszcza wtedy, gdy funkcja jest potrzebna tylko w jednym, konkretnym miejscu. Zamiast stosować pełną definicję funkcji z def, używamy słowa kluczowego lambda, aby szybko stworzyć funkcję w jednej linii.
Podstawowa składnia
# Tak wygląda standardowo zdefiniowana funkcja
def add(x, y):
return x + y
print(add(3, 5)) # 8
# A tak lambda
add = lambda x, y: x + y
print(add(3, 5)) # 8
Lambda z sorted()
# Sortowanie po dowolnym kluczu
osoby = [
{"imie": "Anna", "wiek": 30},
{"imie": "Jan", "wiek": 25},
{"imie": "Piotr", "wiek": 35}
]
# Sortowanie według wieku
posortowane = sorted(osoby, key=lambda x: x["wiek"])
print(posortowane) # [{'imie': 'Jan', 'wiek': 25}, ...]
Lambda z filter()
liczby = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
parzyste = list(filter(lambda x: x % 2 == 0, liczby))
print(parzyste) # [2, 4, 6, 8, 10]
Lambda z map()
liczby = [1, 2, 3, 4, 5]
kwadraty = list(map(lambda x: x ** 2, liczby))
print(kwadraty) # [1, 4, 9, 16, 25]
Lambda z max/min
teksty = ["Python", "Java", "C++", "JavaScript"]
najdluzszy = max(teksty, key=lambda x: len(x))
print(najdluzszy) # "JavaScript"
# Znalezienie największej wartości w liście słowników
osoby = [{"imie": "Anna", "wiek": 30}, {"imie": "Jan", "wiek": 25}]
najstarszy = max(osoby, key=lambda x: x["wiek"])
print(najstarszy) # {'imie': 'Anna', 'wiek': 30}
Wielowierszowe lambdy? Nie zawsze!
Lambda powinny być proste i jednolinijkowe:
# ✅ Dobrze - prosta operacja
square = lambda x: x ** 2
# ❌ Nie rób tego - lambda nie powinna zawierać print
warto_wykorzystac_def = lambda x: print(x) or x
Kiedy używać lambda?
- Do prostych transformacji w
map(),filter(),sorted(). - Gdy funkcja jest potrzebna tylko raz.
- Do sortowania według niestandardowego klucza.
Kiedy NIE używać lambda?
- Jeśli logika jest skomplikowana - użyj
def. - Gdy funkcja jest długa (więcej niż 1-2 operacje)
- Gdy potrzebujesz dokumentacji (docstring).
- Jeśli funkcja będzie używana wielokrotnie - nazwij ją.
📝 Zadania
Stwórz plik python1course/zaj02/lambda.py i wykonaj w nim poniższe zadania.
-
Masz daną listę słowników reprezentujących informacje o książkach w bibliotece. Każdy słownik zawiera klucze:
tytul,autororazrok_wydania.ksiazki = [ {"tytul": "Władca Pierścieni", "autor": "J.R.R. Tolkien", "rok_wydania": 1954}, {"tytul": "Harry Potter i Kamień Filozoficzny", "autor": "J.K. Rowling", "rok_wydania": 1997}, {"tytul": "Duma i uprzedzenie", "autor": "Jane Austen", "rok_wydania": 1813}, {"tytul": "Rok 1984", "autor": "George Orwell", "rok_wydania": 1949}, {"tytul": "Zbrodnia i kara", "autor": "Fiodor Dostojewski", "rok_wydania": 1866}, {"tytul": "Mistrz i Małgorzata", "autor": "Michaił Bułhakow", "rok_wydania": 1967}, {"tytul": "Hobbit", "autor": "J.R.R. Tolkien", "rok_wydania": 1937}, {"tytul": "Sto lat samotności", "autor": "Gabriel García Márquez", "rok_wydania": 1967}, {"tytul": "Imię róży", "autor": "Umberto Eco", "rok_wydania": 1980}, {"tytul": "Solaris", "autor": "Stanisław Lem", "rok_wydania": 1961}, ]Twoim zadaniem jest napisanie kodu, który wykonuje następujące operacje przy użyciu funkcji lambda:
-
Sortowanie książek według roku wydania: Posortuj listę książek w kolejności rosnącej według roku ich wydania.
-
Filtracja książek wydanych po 2000 roku: Utwórz nową listę zawierającą tylko te książki, które zostały wydane po roku 2000.
-
Transformacja listy do listy tytułów: Przekształć oryginalną listę książek w listę zawierającą tylko tytuły książek.
Wykorzystaj funkcje
sorted(),filter()orazmap()w połączeniu z funkcjami lambda do realizacji zadania. -
-
Stwórz funkcję lambda, która:
- Przyjmuje dwa argumenty:
xiy, - Zwraca
Truejeśli oba są parzyste, - Zwraca
Falsew przeciwnym razie.
Przetestuj ją na kilku parach wartości.
- Przyjmuje dwa argumenty:
-
Masz listę uczniów:
["Anna Kowalska", "Jan Nowak", "Piotr Wiśniewski", "Ewa Zielińska"]. Napisz kod, który:- Uszereguje uczniów alfabetycznie według nazwiska (drugiego słowa),
- Stworzy listę, która zawiera tylko inicjały każdego ucznia (np. "AK" dla "Anna Kowalska").
Użyj
sorted()imap()z funkcjami lambda.Wskazówka
Wykorzystaj metodę
.split()do podziału nazwiska.