Skip to content

Latest commit

 

History

History
122 lines (85 loc) · 4.1 KB

File metadata and controls

122 lines (85 loc) · 4.1 KB

Przykłady wykorzystania funkcji lambda w Pythonie

Cel: Poznanie praktycznych zastosowań funkcji lambda, szczególnie w przetwarzaniu struktur danych i operacjach funkcyjnych (map, filter, reduce, sorted).


1. Sortowanie list i słowników (key)

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)]

2. Funkcje wyższego rzędu

Map Filter Reduce

map(funkcja, sekwencja)

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]

filter(warunek, sekwencja)

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]

reduce(funkcja, sekwencja, poczatek)

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ć map i filter są przydatne, w Pythonie często preferowane są list comprehensions ze względu na czytelność i wydajność.

3. Przykład: API Helper (Dive into Python)

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 (jednolinijkowy if/else w starym stylu Pythona). Dziś zrobilibyśmy to wyrażeniem warunkowym ... if collapse else ....

Większy przykład (dla studentów I stopnia)

Uruchomienie:

python 04-lambda-usage/examples/data_pipeline.py
python 04-lambda-usage/examples/apihelper.py

Zadania do samodzielnego rozwiązania

Pliki zadań:

pytest 04-lambda-usage/exercises/test_solutions.py -v

Lista zadań

  1. sortuj_produkty(produkty, klucz) – sortowanie listy słowników po zadanym polu.
  2. filtruj_transakcje(transakcje, prog) – filtrowanie po progu kwoty.
  3. mapuj_kwoty_brutto(transakcje, vat) – mapowanie kwot netto na brutto.
  4. agreguj_kwoty(transakcje) – redukcja listy transakcji do jednej sumy.
  5. ranking_studentow(studenci) – ranking według średniej malejąco.

Referencje

Literatura

  • 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).

Źródła internetowe