Деталі електронної книги

Efektywny Python. 125 sposobów na lepszy kod. Wydanie III

Efektywny Python. 125 sposobów na lepszy kod. Wydanie III

Brett Slatkin

Eлектронна книга

Python cieszy się dużym uznaniem. Jest wszechstronny i efektywny, a przy tym konsekwentnie rozwijany. Język ten ma również wiele trudniejszych do uchwycenia zalet. Aby uzyskać imponujące efekty wydajności kodu, jego wieloplatformowość i bezpieczeństwo, a przy tym w pełni korzystać z możliwości Pythona, potrzebujesz czegoś więcej niż tylko znajomość jego składni.

To trzecie, zaktualizowane i uzupełnione wydanie lubianego podręcznika programowania w Pythonie. Zawiera dodatkowe rozdziały dotyczące tak ważnych zagadnień jak algorytmy i struktury danych. Zawarty w książce materiał, w tym słowniki , ułatwi Ci tworzenie solidnego i wydajnego kodu. Znajdziesz tu jasne, zwięzłe i praktyczne rady przeznaczone dla programistów na różnym poziomie zaawansowania. Niezależnie od tego, czy tworzysz aplikacje internetowe, analizujesz dane, czy trenujesz modele sztucznej inteligencji, dzięki temu podręcznikowi zdobędziesz cenne umiejętności pracy z Pythonem!

W książce:

  • 125 gotowych do użycia sposobów na lepszy kod
  • uaktualnione najlepsze praktyki, uwzględniające nowości w Pythonie do wersji 3.13
  • dodatkowe rozdziały poświęcone tworzeniu niezawodnych, wysoko wydajnych programów
  • tworzenie modułów rozszerzeń w języku C
  • współpraca z natywnymi bibliotekami współdzielonymi
  • praktyczne przykłady kodu odzwierciedlające najlepsze praktyki

Programujesz w Pythonie? Poznaj 125 sposobów na lepszy kod!

Wprowadzenie

Podziękowania

O autorze

Rozdział 1. Programowanie zgodne z duchem Pythona

  • Sposób 1. Ustalenie używanej wersji Pythona
  • Sposób 2. Stosuj styl PEP 8
  • Sposób 3. Nigdy nie oczekuj, że Python wykryje błędy podczas kompilacji
  • Sposób 4. Decyduj się na funkcje pomocnicze zamiast na skomplikowane wyrażenia
  • Sposób 5. Zamiast indeksowania wybieraj rozpakowanie wielu operacji przypisania
  • Sposób 6. Krotkę jednoelementową zawsze umieszczaj w nawiasie
  • Sposób 7. W prostej logice osadzonej używaj wyrażeń warunkowych
  • Sposób 8. Unikaj powtórzeń w wyrażeniach przypisania
  • Sposób 9. Stosuj polecenie match w celu destrukturyzacji kontroli przepływu, ale unikaj go, gdy wystarczające będzie polecenie if

Rozdział 2. Ciągi tekstowe i wycinki

  • Sposób 10. Różnice między typami bytes i str
  • Sposób 11. Wybieraj interpolowane ciągi tekstowe f zamiast ciągów tekstowych formatowania w stylu C i funkcji str.format()
  • Sposób 12. Różnice między wywołaniami repr i str podczas wyświetlania obiektów
  • Sposób 13. Wybieraj jawną konkatenację ciągu tekstowego zamiast niejawnej, zwłaszcza w przypadku listy
  • Sposób 14. Umiejętnie podziel sekwencje
  • Sposób 15. Unikaj użycia indeksów początek, koniec i wartości kroku w pojedynczej operacji podziału
  • Sposób 16. Wybieraj rozpakowanie typu catch-all zamiast tworzenia wycinków

Rozdział 3. Pętle i iteratory

  • Sposób 17. Preferuj użycie funkcji enumerate() zamiast range()
  • Sposób 18. Używaj funkcji zip() do równoczesnego przetwarzania iteratorów
  • Sposób 19. Unikaj bloków else po pętlach for i while
  • Sposób 20. Nigdy nie używaj zmiennych pętli for po zakończeniu jej działania
  • Sposób 21. Podczas iteracji przez argumenty zachowuj postawę defensywną
  • Sposób 22. Nigdy nie modyfikuj kontenerów podczas iteracji przez nie, lecz skorzystaj z kopii lub pamięci podręcznej
  • Sposób 23. Przekazuj iteratory do wywołań any() i all() w celu skrócenia logiki
  • Sposób 24. Rozważ stosowanie modułu itertools w pracy z iteratorami i generatorami

Rozdział 4. Słowniki

  • Sposób 25. Zachowaj ostrożność, gdy polegasz na kolejności wstawiania elementów do obiektu typu dict
  • Sposób 26. Podczas obsługi brakujących kluczy słownika wybieraj funkcję get() zamiast operatora in i wyjątku KeyError
  • Sposób 27. Podczas obsługi brakujących elementów w wewnętrznym stanie wybieraj typ defaultdict zamiast metody setdefault()
  • Sposób 28. Wykorzystaj metodę __missing__() do tworzenia wartości domyślnych w zależności od klucza
  • Sposób 29. Twórz klasy, zamiast zagnieżdżać wiele poziomów słowników, list i krotek

Rozdział 5. Funkcje

  • Sposób 30. Ustal, kiedy argumenty funkcji mogą być zmienione
  • Sposób 31. Zwróć obiekt, gdy funkcja ma rozpakować więcej niż trzy zmienne
  • Sposób 32. Preferuj wyjątki zamiast zwrotu wartości None
  • Sposób 33. Zobacz, jak domknięcia współdziałają z zakresem zmiennej
  • Sposób 34. Zmniejszenie wizualnego zagmatwania za pomocą zmiennej liczby argumentów pozycyjnych
  • Sposób 35. Zdefiniowanie zachowania opcjonalnego za pomocą argumentów w postaci słów kluczowych
  • Sposób 36. Użycie None i docstring w celu dynamicznego określenia argumentów domyślnych
  • Sposób 37. Wymuszaj czytelność kodu za pomocą argumentów w postaci słów kluczowych i argumentów jedynie pozycyjnych
  • Sposób 38. Dekoratory funkcji definiuj za pomocą functools.wraps
  • Sposób 39. Podczas łączenia funkcji preferuj functools.partial zamiast wyrażeń lambda

Rozdział 6. Konstrukcje składane i generatory

  • Sposób 40. Używaj list składanych zamiast funkcji map() i filter()
  • Sposób 41. Unikaj więcej niż dwóch wyrażeń na liście składanej
  • Sposób 42. Stosuj wyrażenia przypisania, aby unikać powielania zadań w konstrukcjach składanych
  • Sposób 43. Rozważ użycie generatorów, zamiast zwracać listy
  • Sposób 44. Rozważ użycie generatora wyrażeń dla dużych list składanych
  • Sposób 45. Twórz wiele generatorów za pomocą wyrażenia yield from
  • Sposób 46. Iteratory przekazuj generatorom jako argumenty zamiast za pomocą metody send()
  • Sposób 47. Przejścia między stanami obsługuj za pomocą klasy, zamiast używać metody throw()

Rozdział 7. Klasy i interfejsy

  • Sposób 48. Dla prostych interfejsów akceptuj funkcje zamiast klas
  • Sposób 49. Wybieraj zorientowany obiektowo polimorfizm zamiast funkcji z wywołaniami isinstance()
  • Sposób 50. W stylu programowania funkcyjnego używaj functools.singledispatch zamiast polimorfizmu zorientowanego obiektowo
  • Sposób 51. Używaj typu dataclasses zamiast lekkich klas
  • Sposób 52. Użycie polimorfizmu @classmethod w celu ogólnego tworzenia obiektów
  • Sposób 53. Inicjalizacja klasy nadrzędnej za pomocą wywołania super()
  • Sposób 54. Rozważ łączenie funkcjonalności za pomocą klas domieszek
  • Sposób 55. Preferuj atrybuty publiczne zamiast prywatnych
  • Sposób 56. Wybieraj moduł dataclasses, zamiast tworzyć niemodyfikowalne obiekty
  • Sposób 57. Stosuj dziedziczenie po collections.abc w kontenerach typów niestandardowych

Rozdział 8. Metaklasy i atrybuty

  • Sposób 58. Używaj zwykłych atrybutów zamiast metod typu getter i setter
  • Sposób 59. Rozważ użycie @property zamiast refaktoryzacji atrybutów
  • Sposób 60. Stosuj deskryptory, aby wielokrotnie wykorzystywać metody udekorowane przez @property
  • Sposób 61. Używaj metod __getattr__(), __getattribute__() i __setattr__() dla opóźnionych atrybutów
  • Sposób 62. Sprawdzaj podklasy za pomocą __init_subclass__
  • Sposób 63. Rejestruj istniejące klasy za pomocą __init_subclass__()
  • Sposób 64. Adnotacje atrybutów klas dodawaj za pomocą metody __set_name__()
  • Sposób 65. Przemyśl kolejność definicji klasy, aby zdefiniować powiązania między atrybutami
  • Sposób 66. Dla złożonych rozszerzeń klas wybieraj dekoratory klas zamiast metaklas

Rozdział 9. Współbieżność i równoległość

  • Sposób 67. Używaj modułu subprocess do zarządzania procesami potomnymi
  • Sposób 68. Użycie wątków dla operacji blokujących wejście-wyjście, unikanie równoległości
  • Sposób 69. Używaj klasy Lock, aby unikać stanu wyścigu w wątkach
  • Sposób 70. Używaj klasy Queue do koordynacji pracy między wątkami
  • Sposób 71. Naucz się rozpoznawać, kiedy współbieżność jest niezbędna
  • Sposób 72. Unikaj tworzenia nowych egzemplarzy Thread na żądanie fan-out
  • Sposób 73. Pamiętaj, że stosowanie Queue do obsługi współbieżności wymaga refaktoringu
  • Sposób 74. Rozważ użycie klasy ThreadPoolExecutor, gdy wątki są potrzebne do zapewnienia współbieżności
  • Sposób 75. Zapewnij wysoką współbieżność operacji wejścia-wyjścia dzięki użyciu współprogramów
  • Sposób 76. Naucz się przekazywać do asyncio wątkowane operacje wejścia-wyjścia
  • Sposób 77. Połączenie wątków i współprogramów w celu ułatwienia konwersji na wersję stosującą asyncio
  • Sposób 78. Maksymalizuj responsywność przez unikanie blokującej pętli zdarzeń asyncio
  • Sposób 79. Rozważ użycie concurrent.futures(), aby otrzymać prawdziwą równoległość

Rozdział 10. Niezawodność

  • Sposób 80. Wykorzystuj zalety wszystkich bloków w konstrukcji try-except-else-finally
  • Sposób 81. Używaj polecenia assert dla wewnętrznych założeń i raise w przypadku niespełnionych oczekiwań
  • Sposób 82. Rozważ użycie poleceń contextlib i with w celu uzyskania wielokrotnego użycia konstrukcji try-finally
  • Sposób 83. Zawsze staraj się maksymalnie skracać blok try
  • Sposób 84. Uważaj na znikające zmienne wyjątku
  • Sposób 85. Uważaj podczas przechwytywania klasy Exception
  • Sposób 86. Poznaj różnicę między klasami Exception i BaseException
  • Sposób 87. Używaj modułu traceback w celu dostarczania dokładniejszych informacji o wyjątkach
  • Sposób 88. Rozważ jawne łączenie wyjątków, aby otrzymać przejrzyste stosy wywołań
  • Sposób 89. Zawsze przekazuj zasoby do generatorów i nakazuj komponentom wywołującym przeprowadzanie operacji porządkowych
  • Sposób 90. Nigdy nie przypisuj wartości False zmiennej __debug__
  • Sposób 91. Unikaj wywołań exec() i eval(), o ile nie tworzysz narzędzia programistycznego

Rozdział 11. Wydajność

  • Sposób 92. Przed optymalizacją przeprowadzaj profilowanie
  • Sposób 93. Wydajność działania kodu o znaczeniu krytycznym optymalizuj za pomocą testów wydajności modułu timeit
  • Sposób 94. Dostrzegaj, kiedy i jak zastąpić Pythona innym językiem programowania
  • Sposób 95. Rozważ użycie modułu ctypes w celu sprawnej integracji z bibliotekami natywnymi
  • Sposób 96. Rozważ użycie modułów rozszerzeń, aby zmaksymalizować wydajność działania i ergonomię
  • Sposób 97. Aby skrócić czas uruchamiania programu, korzystaj ze wstępnie skompilowanego kodu bajtowego i buforowania systemu plików
  • Sposób 98. Stosuj wczytywanie modułów z opóźnieniem i importowanie dynamiczne, aby skrócić czas uruchamiania programu
  • Sposób 99. Rozważ użycie typów memoryview i bytearray, gdy podczas pracy z typem bytes stosujesz tzw. kopiowanie zero

Rozdział 12. Algorytmy i struktury danych

  • Sposób 100. Używaj parametru key podczas sortowania według skomplikowanych kryteriów
  • Sposób 101. Poznaj różnice między metodami sort() i sorted()
  • Sposób 102. Podczas wyszukiwania danych w sortowanych sekwencjach stosuj moduł bisect
  • Sposób 103. Wybieraj typ deque podczas tworzenia kolejek typu producent - konsument
  • Sposób 104. Przekonaj się, jak używać heapq w kolejce priorytetowej
  • Sposób 105. Podczas obsługi czasu lokalnego używaj modułu datetime zamiast time
  • Sposób 106. Gdy ważna jest precyzja, używaj modułu decimal
  • Sposób 107. Niezawodne użycie pickle wraz z copyreg

Rozdział 13. Testowanie i debugowanie

  • Sposób 108. W podklasach klasy TestCase sprawdzaj powiązane ze sobą zachowanie
  • Sposób 109. Wybieraj testy integracyjne zamiast testów jednostkowych
  • Sposób 110. Izoluj testy od siebie za pomocą metod setUp(), tearDown(), setUpModule() i tearDownModule()
  • Sposób 111. Podczas testowania kodu zawierającego skomplikowane zależności korzystaj z imitacji
  • Sposób 112. Hermetyzuj zależności, aby ułatwić tworzenie imitacji i testowanie
  • Sposób 113. Używaj metody assertAlmostEqual() do kontrolowania precyzji w testach liczb zmiennoprzecinkowych
  • Sposób 114. Rozważ interaktywne usuwanie błędów za pomocą pdb
  • Sposób 115. Stosuj moduł tracemalloc, aby poznać sposób użycia pamięci i wykryć jej wycieki

Rozdział 14. Współpraca

  • Sposób 116. Kiedy szukać modułów opracowanych przez społeczność?
  • Sposób 117. Używaj środowisk wirtualnych dla odizolowanych i powtarzalnych zależności
  • Sposób 118. Dla każdej funkcji, klasy i modułu utwórz docstring
  • Sposób 119. Używaj pakietów do organizacji modułów i dostarczania stabilnych API
  • Sposób 120. Rozważ użycie kodu o zasięgu modułu w celu konfiguracji środowiska wdrożenia
  • Sposób 121. Zdefiniuj główny wyjątek Exception w celu odizolowania komponentu wywołującego od API
  • Sposób 122. Zobacz, jak przerwać krąg zależności
  • Sposób 123. Rozważ użycie modułu warnings podczas refaktoryzacji i migracji kodu
  • Sposób 124. Rozważ stosowanie analizy statycznej za pomocą modułu typing w celu usuwania błędów
  • Sposób 125. Podczas tworzenia paczek programów w Pythonie wybieraj projekty otwartoźródłowe zamiast modułów zipimport i zipapp
  • Назва: Efektywny Python. 125 sposobów na lepszy kod. Wydanie III
  • Автор: Brett Slatkin
  • Оригінальна назва: Effective Python: 125 Specific Ways to Write Better Python, 3rd Edition (Effective Software Development Series)
  • Переклад: Robert Górczyński
  • ISBN: 978-83-289-2696-7, 9788328926967
  • Дата видання: 2025-07-29
  • Формат: Eлектронна книга
  • Ідентифікатор видання: efpyt3
  • Видавець: Helion