Programowanie funkcyjne w Pythonie. Jak pisać zwięzły, wydajny i ekspresywny kod - ebook
Programowanie funkcyjne w Pythonie. Jak pisać zwięzły, wydajny i ekspresywny kod - 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!
Spis treści
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
Kategoria: | Programowanie |
Zabezpieczenie: |
Watermark
|
ISBN: | 978-83-8322-990-4 |
Rozmiar pliku: | 4,3 MB |