Efektywny Python. 125 sposobów na lepszy ISBN. Wydanie III Pszczyna

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 …

od 69,50 Najbliżej: 40 km

Liczba ofert: 1

Oferta sklepu

Opis

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! 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 O autorze: Brett Slatkin jest głównym inżynierem oprogramowania w firmie Google. Pracował nad projektem Google Surveys, nad protokołem PubSubHubbub, a wcześniej zajmował się pierwszym w Google produktem przetwarzania w chmurze — App Engine. Ukończył Uniwersytet Columbia w Nowym Jorku, programuje w Pythonie od blisko 20 lat.

Specyfikacja

Podstawowe informacje

Autor
  • Brett Slatkin
Rok wydania
  • 2025
Format
  • PDF
  • MOBI
  • EPUB
Ilość stron
  • 576
Kategorie
  • Programowanie
Wybrane wydawnictwa
  • Helion