Cel: Poznanie praktycznych zastosowań funkcji lambda, szczególnie w przetwarzaniu struktur danych i operacjach funkcyjnych (
map,filter,reduce,sorted).
Funkcja lambda jest często używana jako argument key w sortowaniu.
studenci = [
("Jan", 3.0),
("Anna", 4.5),
("Piotr", 4.0)
]
# Sortowanie po średniej (drugi element krotki)
studenci.sort(key=lambda x: x[1], reverse=True)
print(studenci) # [('Anna', 4.5), ('Piotr', 4.0), ('Jan', 3.0)]Aplikuje funkcję do każdego elementu sekwencji. Zwraca iterator (obiekt leniwy).
liczby = [1, 2, 3, 4]
kwadraty = list(map(lambda x: x**2, liczby))
print(kwadraty) # [1, 4, 9, 16]Zwraca elementy sekwencji, dla których warunek(element) zwraca True (lub wartość truthy).
parzyste = list(filter(lambda x: x % 2 == 0, liczby))
print(parzyste) # [2, 4]Redukuje (zwija) sekwencję do jednej wartości. Wymaga importu z functools.
from functools import reduce
suma = reduce(lambda a, b: a + b, liczby, 0)
print(suma) # 10
⚠️ Uwaga: Choćmapifiltersą przydatne, w Pythonie często preferowane są list comprehensions ze względu na czytelność i wydajność.
Klasyczny przykład z książki Dive into Python Marka Pilgrima, pokazujący potęgę introspekcji i lambd. Służy do automatycznego wypisywania dokumentacji metod obiektu.
def api_help(obj, spacing=10, collapse=1):
"""Wypisuje metody obiektu w sformatowanej tabeli."""
metody = [attr for attr in dir(obj) if callable(getattr(obj, attr))]
process_func = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
print("\n".join(["%s %s" % (method.ljust(spacing),
process_func(str(getattr(obj, method).__doc__)))
for method in metody]))Analiza:
getattr(obj, attr): Dynamiczne pobranie atrybutu/metody po nazwie.callable(...): Sprawdzenie czy to funkcja/metoda.- Lambda w
process_func: Warunkowy wybór funkcji formatującej (jednolinijkowyif/elsew starym stylu Pythona). Dziś zrobilibyśmy to wyrażeniem warunkowym... if collapse else ....
examples/data_pipeline.py– pełny pipeline danych transakcyjnych: filtrowanie, mapowanie, agregacja i ranking klientów.examples/apihelper.py– introspekcja obiektu i dynamiczne formatowanie dokumentacji metod.
Uruchomienie:
python 04-lambda-usage/examples/data_pipeline.py
python 04-lambda-usage/examples/apihelper.pyPliki zadań:
pytest 04-lambda-usage/exercises/test_solutions.py -vsortuj_produkty(produkty, klucz)– sortowanie listy słowników po zadanym polu.filtruj_transakcje(transakcje, prog)– filtrowanie po progu kwoty.mapuj_kwoty_brutto(transakcje, vat)– mapowanie kwot netto na brutto.agreguj_kwoty(transakcje)– redukcja listy transakcji do jednej sumy.ranking_studentow(studenci)– ranking według średniej malejąco.
- Pilgrim, M. (2004). Dive Into Python. Apress. Rozdział 4 (The Power of Introspection).
- Lutz, M. (2013). Learning Python, 5th ed. O'Reilly. Rozdział 19 (Advanced Function Topics).
