reklama - zainteresowany?

Efektywny Python. 125 sposob - Helion

Efektywny Python. 125 sposob
Autor: Brett Slatkin
ISBN: 978-83-289-2695-0
okładka: mi
Księgarnia: Helion

Książka będzie dostępna od kwietnia 2025

 

Zobacz także:

  • Jak zhakowa
  • Windows Media Center. Domowe centrum rozrywki
  • Ruby on Rails. Ćwiczenia
  • Efekt piaskownicy. Jak szefować żeby roboty nie zabrały ci roboty
  • Przywództwo w świecie VUCA. Jak być skutecznym liderem w niepewnym środowisku

Spis treści

Efektywny Python. 125 sposobów na lepszy kod. Wydanie III -- spis treści

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

Code, Publish & WebDesing by CATALIST.com.pl



(c) 2005-2025 CATALIST agencja interaktywna, znaki firmowe należą do wydawnictwa Helion S.A.