E-book details

Programowanie funkcyjne w Pythonie. Jak pisać zwięzły, wydajny i ekspresywny kod. Wydanie III

Programowanie funkcyjne w Pythonie. Jak pisać zwięzły, wydajny i ekspresywny kod. Wydanie III

Steven F. Lott

Ebook

Mimo że Python nie jest typowym językiem programowania funkcyjnego, umożliwia pisanie kodu w sposób właściwy dla tego podejścia. W efekcie można tworzyć zwięzłe i eleganckie programy, które działają szybciej i zużywają mniej zasobów. Jeśli uważasz, że te argumenty uzasadniają zapoznanie się z funkcyjnym podejściem do programowania w Pythonie, to ta książka jest dla Ciebie.

Dzięki temu praktycznemu podręcznikowi zrozumiesz, kiedy i dlaczego warto zastosować myślenie funkcyjne, a także jak korzystać z technik funkcyjnych w różnych scenariuszach. Dowiesz się również, jakie narzędzia i biblioteki przeznaczone do tego celu są dostępne w Pythonie i jak używać wyrażeń generatorowych, list składanych i dekoratorów. W tym wydaniu znalazły się nowe rozdziały dotyczące złożonych obiektów bezstanowych, funkcji kombinatorycznych i pakietu toolz, zawierającego zbiór modułów wspomagających pisanie programów funkcyjnych. Umieszczono tu ponadto sporo ciekawych przykładów, dotyczących choćby eksploracyjnej analizy danych i ich czyszczenia.

W książce między innymi:

  • najciekawsze biblioteki i wbudowane funkcje wyższego rzędu w Pythonie
  • tworzenie funkcji generatorowych i leniwe wartościowanie
  • implementacja dekoratorów do kompozycji funkcyjnej
  • podpowiedzi typów w Pythonie
  • obsługa współbieżności i implementacja usług sieciowych
  • biblioteka PyMonad i tworzenie symulacji z obsługą stanów

Chcesz tworzyć wydajny kod? Naucz się programowania funkcyjnego!

Słowo wstępne

O autorze

O recenzentach

Przedmowa

Rozdział 1. Zrozumieć programowanie funkcyjne

  • Funkcyjny styl programowania
  • Podobieństwa i różnice pomiędzy stylami proceduralnym i funkcyjnym
    • Korzystanie z paradygmatu funkcyjnego
    • Korzystanie z funkcyjnych hybryd
    • Stos żółwi
  • Klasyczny przykład programowania funkcyjnego
  • Eksploracyjna analiza danych
  • Podsumowanie
  • Ćwiczenia
    • Konwersja imperatywnego algorytmu na kod funkcyjny
    • Konwersja obliczeń krokowych na kod funkcyjny
    • Popraw funkcję sqrt()
    • Etapy czyszczenia danych
    • Optymalizacja kodu funkcyjnego (zaawansowane)

Rozdział 2. Podstawowe pojęcia programowania funkcyjnego

  • Funkcje jako obiekty pierwszej klasy
    • Czyste funkcje
    • Funkcje wyższego rzędu
  • Dane niemutowalne
  • Wartościowanie ścisłe i nieścisłe
  • Wartościowanie leniwe i zachłanne
  • Rekurencja zamiast jawnego stanu pętli
  • Funkcyjne systemy typów
  • Znajome terytorium
  • Pojęcia zaawansowane
  • Podsumowanie
  • Ćwiczenia
    • Zastosowanie funkcji map() do sekwencji wartości
    • Funkcje czy wyrażenia lambda?
    • Zoptymalizuj rekurencję

Rozdział 3. Funkcje, iteratory i generatory

  • Pisanie czystych funkcji
  • Funkcje jako obiekty pierwszej klasy
  • Korzystanie z łańcuchów znaków
  • Używanie krotek i krotek nazwanych
  • Korzystanie z wyrażeń generatorowych
    • Odkrywanie ograniczeń generatorów
    • Łączenie wyrażeń generatorowych
  • Czyszczenie surowych danych za pomocą funkcji generatorowych
  • Stosowanie generatorów do wbudowanych kolekcji
    • Generatory dla list, słowników i zbiorów
    • Korzystanie z mapowań stanowych
    • Wykorzystanie modułu bisect do tworzenia mapowania
    • Używanie stanowych zbiorów
  • Podsumowanie
  • Ćwiczenia
    • Przepisz funkcję some_function()
    • Alternatywna definicja klasy Mersenne
    • Alternatywy implementacji algorytmów
    • Mapowanie i filtrowanie
    • Słowniki składane
    • Oczyszczanie surowych danych

Rozdział 4. Praca z kolekcjami

  • Przegląd rodzajów funkcji
  • Praca z obiektami iterowalnymi
    • Parsowanie pliku XML
    • Parsowanie pliku na wyższym poziomie
    • Tworzenie par elementów z sekwencji
    • Jawne użycie funkcji iter()
    • Rozszerzanie iteracji
    • Stosowanie wyrażeń generatorowych do funkcji skalarnych
  • Wykorzystanie funkcji any() i all() jako redukcji
  • Używanie funkcji len() i sum() dla kolekcji
    • Używanie sum i zliczeń w obliczeniach statystycznych
  • Korzystanie z funkcji zip() do tworzenia struktury i spłaszczania sekwencji
    • Rozpakowywanie spakowanej sekwencji
    • Spłaszczanie sekwencji
    • Nadawanie struktury płaskim sekwencjom
    • Tworzenie struktury płaskich sekwencji - podejście alternatywne
  • Wykorzystanie funkcji sorted() i reversed() do zmiany kolejności elementów
  • Wykorzystanie funkcji enumerate() w celu uwzględnienia numeru porządkowego
  • Podsumowanie
  • Ćwiczenia
    • Liczby palindromiczne
    • Zestaw kart w ręku
    • Zamień funkcję legs() na pairwise()
    • Rozszerz rozwiązanie z funkcją legs(), aby uwzględnić przetwarzanie par

Rozdział 5. Funkcje wyższego rzędu

  • Wykorzystanie funkcji max() i min() do wyszukiwania ekstremów
    • Korzystanie z formatu wyrażeń lambda w Pythonie
    • Wyrażenia lambda i rachunek lambda
  • Korzystanie z funkcji map() w celu zastosowania funkcji do kolekcji
    • Wykorzystanie wyrażeń lambda i funkcji map()
    • Użycie funkcji map() w odniesieniu do wielu sekwencji
  • Wykorzystanie funkcji filter() do przekazywania lub odrzucania danych
    • Użycie funkcji filter() do identyfikacji wartości odstających
  • Funkcja iter() z wartością "strażnika"
  • Wykorzystanie funkcji sorted() do porządkowania danych
  • Pisanie funkcji wyższego rzędu - przegląd
  • Pisanie mapowań i filtrów wyższego rzędu
    • Rozpakowywanie danych podczas mapowania
    • Opakowywanie dodatkowych danych podczas mapowania
    • Spłaszczanie danych podczas mapowania
    • Strukturyzacja danych podczas filtrowania
  • Budowanie funkcji wyższego rzędu z wykorzystaniem obiektów wywoływalnych
    • Zapewnienie dobrego projektu funkcyjnego
  • Przegląd wybranych wzorców projektowych
  • Podsumowanie
  • Ćwiczenia
    • Klasyfikacja stanu
    • Klasyfikacja stanu, część II
    • Optymalizacja parsera plików

Rozdział 6. Rekurencje i redukcje

  • Proste rekurencje numeryczne
    • Implementacja ręcznej optymalizacji ogonowej
    • Pozostawienie rekurencji bez zmian
    • Obsługa trudnego przypadku optymalizacji ogonowej
    • Przetwarzanie kolekcji za pomocą rekurencji
    • Optymalizacja ogonowa dla kolekcji
    • Używanie operatora przypisania (czasami zwanego morsem) w rekurencjach
  • Redukcje i składanie kolekcji z wielu elementów w jeden element
    • Optymalizacja wywołań ogonowych za pomocą kolejek dwukierunkowych
  • Redukcja grupowania - z wielu elementów do mniejszej liczby
    • Budowanie mapowania za pomocą metody Counter
    • Budowanie mapowania przez sortowanie
    • Grupowanie lub podział danych według wartości klucza
    • Pisanie bardziej ogólnych redukcji grupujących
    • Pisanie redukcji wyższego rzędu
    • Pisanie parserów plików
  • Podsumowanie
  • Ćwiczenia
    • Wielokrotna rekurencja i buforowanie
    • Refaktoryzacja funkcji all_print()
    • Parsowanie plików CSV
    • Klasyfikacja stanu, część III
    • Dane silnika Diesla

Rozdział 7. Złożone obiekty bezstanowe

  • Używanie krotek do zbierania danych
  • Używanie obiektów NamedTuple do zbierania danych
  • Używanie do zbierania danych dekoratora dataclass z parametrem frozen
  • Inicjalizacja złożonych obiektów i obliczenia właściwości
  • Używanie modułu pyrsistent do zbierania danych
  • Unikanie stanowych klas dzięki wykorzystaniu rodzin krotek
    • Obliczanie korelacji rangowej Spearmana
  • Polimorfizm i dopasowywanie typów z wzorcami
  • Podsumowanie
  • Ćwiczenia
    • Zamrożone słowniki
    • Sekwencje podobne do słowników
    • Modyfikacja funkcji rank_xy() w celu wykorzystywania natywnych typów
    • Popraw funkcję rank_corr()
    • Modyfikacja funkcji legs() w celu wykorzystania modułu pyrsistent

Rozdział 8. Moduł itertools

  • Praca z iteratorami nieskończonymi
    • Liczenie za pomocą count()
    • Zliczanie z wykorzystaniem argumentów zmiennoprzecinkowych
    • Wielokrotne iterowanie cyklu za pomocą funkcji cycle()
    • Powtarzanie pojedynczej wartości za pomocą funkcji repeat()
  • Używanie iteratorów skończonych
    • Przypisywanie liczb za pomocą funkcji enumerate()
    • Obliczanie sum narastających za pomocą funkcji accumulate()
    • Łączenie iteratorów za pomocą funkcji chain()
    • Podział iteratora na partycje za pomocą funkcji groupby()
    • Scalanie obiektów iterowalnych za pomocą funkcji zip_longest() i zip()
    • Tworzenie par za pomocą funkcji pairwise()
    • Filtrowanie z wykorzystaniem funkcji compress()
    • Zbieranie podzbiorów za pomocą funkcji islice()
    • Filtrowanie stanowe z wykorzystaniem funkcji dropwhile() i takewhile()
    • Dwa podejścia do filtrowania za pomocą funkcji filterfalse() i filter()
    • Zastosowanie funkcji do danych z wykorzystaniem funkcji starmap() i map()
  • Klonowanie iteratorów za pomocą funkcji tee()
  • Receptury modułu itertools
  • Podsumowanie
  • Ćwiczenia
    • Zoptymalizuj funkcję find_first()
    • Porównaj rozwiązanie z rozdziału 4. z recepturą itertools.pairwise()
    • Porównaj rozwiązanie z rozdziału 4. z recepturą itertools.tee()
    • Podział zestawu danych do celów szkolenia i testowania
    • Szeregowanie rang

Rozdział 9. Moduł itertools dla kombinatoryków - permutacje i kombinacje

  • Wyliczanie iloczynu kartezjańskiego
  • Redukowanie iloczynu
    • Obliczanie odległości
    • Uzyskanie wszystkich pikseli i wszystkich kolorów
  • Poprawa wydajności
    • Przeformowanie problemu
    • Łączenie dwóch transformacji
  • Permutacje zbioru wartości
  • Generowanie wszystkich kombinacji
    • Kombinacje z powtórzeniami
  • Receptury
  • Podsumowanie
  • Ćwiczenia
    • Alternatywne obliczenia odległości
    • Rzeczywista dziedzina wartości kolorów pikseli
    • Punktacja ręki w grze Cribbage

Rozdział 10. Moduł functools

  • Narzędzia przetwarzania funkcji
  • Memoizacja wcześniejszych wyników za pomocą dekoratora cache
  • Definiowanie klas z dekoratorem total_ordering
  • Stosowanie argumentów częściowych za pomocą funkcji partial()
  • Redukcja zbiorów danych za pomocą funkcji reduce()
    • Łączenie funkcji map() i reduce()
    • Korzystanie z funkcji reduce() i partial()
    • Użycie funkcji map() i reduce() do oczyszczania surowych danych
    • Korzystanie z funkcji groupby() i reduce()
    • Unikanie problemów z funkcją reduce()
  • Obsługa wielu typów za pomocą funkcji singledispatch
  • Podsumowanie
  • Ćwiczenia
    • Porównanie funkcji string.join() i reduce()
    • Rozszerzenie funkcji comma_fix()
    • Modyfikacja funkcji clean_sum()

Rozdział 11. Pakiet toolz

  • Funkcja starmap z pakietu itertools
  • Redukcje z wykorzystaniem funkcji modułu operator
  • Korzystanie z pakietu toolz
    • Wybrane funkcje modułu itertoolz
    • Wybrane funkcje modułu dicttoolz
    • Wybrane funkcje modułu functoolz
  • Podsumowanie
  • Ćwiczenia
    • Zamiana dzielenia na ułamek
    • Parsowanie pliku kolorów
    • Analiza kwartetu Anscombe'a
    • Obliczenia punktów trasy
    • Geostrefa punktów trasy
    • Obiekt wywoływalny dla funkcji row_counter()

Rozdział 12. Techniki projektowania dekoratorów

  • Dekoratory jako funkcje wyższego rzędu
    • Korzystanie z funkcji update_wrapper() z modułu functools
  • Zagadnienia przekrojowe
  • Funkcje złożone
    • Wstępne przetwarzanie nieprawidłowych danych
  • Dekoratory z parametrami
  • Implementacja bardziej złożonych dekoratorów
  • Kwestie złożonego projektu
  • Podsumowanie
  • Ćwiczenia
    • Konwersje dat i godzin
    • Optymalizacja dekoratora
    • Funkcje obsługujące wartości None
    • Logowanie
    • Sprawdzanie "na sucho"

Rozdział 13. Biblioteka PyMonad

  • Pobieranie i instalacja modułu PyMonad
  • Kompozycja funkcyjna i rozwijanie funkcji
    • Korzystanie z rozwijanych funkcji wyższego rzędu
    • Kompozycja funkcyjna z wykorzystaniem biblioteki PyMonad
  • Funktory - uczyń funkcję ze wszystkiego
    • Korzystanie z wartościowanej leniwie monady ListMonad()
  • Funkcja monady bind()
  • Implementacja symulacji za pomocą monad
  • Dodatkowe własności biblioteki PyMonad
  • Podsumowanie
  • Ćwiczenia
    • Popraw aproksymację z wykorzystaniem funkcji arcus tangens
    • Obliczenia statystyczne
    • Walidacja danych
    • Wiele modeli

Rozdział 14. Moduły Multiprocessing, Threading i Concurrent.Futures

  • Programowanie funkcyjne a współbieżność
  • Co naprawdę oznacza współbieżność?
    • Warunki brzegowe
    • Współdzielenie zasobów za pomocą procesów lub wątków
    • Jak uzyskać największe korzyści?
  • Korzystanie z pul wieloprocesowych i zadań
    • Przetwarzanie wielu dużych plików
    • Parsowanie plików logu - pobieranie wierszy
    • Parsowanie wierszy logu do postaci nazwanych krotek
    • Parsowanie dodatkowych pól obiektu Access
    • Filtrowanie szczegółów dostępu
    • Analiza szczegółów dostępu
    • Pełny proces analizy
  • Korzystanie z puli wieloprocesowej w celu przetwarzania równoległego
    • Korzystanie z funkcji apply() do wykonywania pojedynczych żądań
    • Bardziej złożone architektury przetwarzania wieloprocesowego
    • Korzystanie z modułu concurrent.futures
    • Korzystanie z pul wątków modułu concurrent.futures
    • Korzystanie z modułów threading i queue
    • Korzystanie z funkcji asynchronicznych
    • Projektowanie współbieżnego przetwarzania
  • Podsumowanie
  • Ćwiczenia
    • Leniwe parsowanie
    • Filtrowanie szczegółów ścieżki dostępu
    • Dodaj dekoratory @cache
    • Utworzenie przykładowych danych
    • Zmiana struktury potoku

Rozdział 15. Podejście funkcyjne do usług sieciowych

  • Model HTTP żądanie-odpowiedź
    • Wstrzykiwanie stanu za pomocą plików cookie
    • Serwer o projekcie funkcyjnym
    • Szczegóły widoku funkcyjnego
    • Zagnieżdżanie usług
  • Standard WSGI
    • Zgłaszanie wyjątków podczas przetwarzania WSGI
    • Praktyczne aplikacje webowe
  • Definiowanie usług sieciowych jako funkcji
    • Przetwarzanie za pomocą aplikacji Flask
    • Warstwa dostępu do danych
  • Monitorowanie użycia
  • Podsumowanie
  • Ćwiczenia
    • Aplikacja WSGI - powitanie
    • Aplikacja WSGI - demo
    • Serializacja danych do formatu XML
    • Serializacja danych do formatu HTML
  • Title: Programowanie funkcyjne w Pythonie. Jak pisać zwięzły, wydajny i ekspresywny kod. Wydanie III
  • Author: Steven F. Lott
  • Original title: Functional Python Programming: Use a functional approach to write succinct, expressive, and efficient Python code, 3rd Edition
  • Translation: Radosław Meryk
  • ISBN: 978-83-8322-990-4, 9788383229904
  • Date of issue: 2023-10-24
  • Format: Ebook
  • Item ID: pytpf3
  • Publisher: Helion