Python. Nowoczesne programowanie w prostych krokach. Wydanie III Bełchatów

Ta książka pokazuje, jak Python krzyżuje się z innymi ważnymi dziedzinami (sztuczną inteligencją, bazami danych, serwerami sieciowymi itd.) w dzisiejszym świecie, który tak szybko się zmienia. Patrick Viafore, autor książki Robust Python Opanuj Pythona od podstaw po AI i twórz nowoczesny kod bez …

od 80,47 zł Najbliżej: 47 km

Liczba ofert: 1

Oferta sklepu

Opis

Ta książka pokazuje, jak Python krzyżuje się z innymi ważnymi dziedzinami (sztuczną inteligencją, bazami danych, serwerami sieciowymi itd.) w dzisiejszym świecie, który tak szybko się zmienia. Patrick Viafore, autor książki Robust Python Opanuj Pythona od podstaw po AI i twórz nowoczesny kod bez tajemnic! Python to jeden z najpopularniejszych języków programowania na świecie. Jego wszechstronność, czytelność i zgromadzona wokół niego ogromna społeczność sprawiają, że napędza on rewolucję technologiczną od tworzenia nowoczesnych aplikacji webowych, przez analizę danych, aż po rozwój sztucznej inteligencji i uczenia maszynowego. Ta pozycja to idealny przewodnik dla każdego, kto chce wejść do tego fascynującego świata lub uporządkować swoją wiedzę. W dobie błyskawicznie zmieniających się trendów IT solidne opanowanie Pythona to inwestycja, która gwarantuje przewagę na rynku pracy i otwiera drzwi do kariery w najbardziej innowacyjnych projektach. Książka stanowi kompleksowe, a zarazem przystępne wprowadzenie do programowania w Pythonie. Autor prowadzi czytelnika od absolutnych podstaw takich jak zmienne, typy danych, pętle i funkcje aż po zaawansowane zagadnienia niezbędne w codziennej pracy profesjonalnego programisty. W trzecim wydaniu zaktualizowano wszystkie informacje i dodano zupełnie nowe rozdziały poświęcone sztucznej inteligencji, data science i optymalizacji wydajności kodu. Czytelnik dowie się, jak zarządzać środowiskiem programistycznym, korzystać z relacyjnych i nierelacyjnych baz danych, tworzyć aplikacje sieciowe, a także wdrażać współbieżność. To praktyczny podręcznik, który uczy nie tylko samej składni, ale przede wszystkim pythonicznego sposobu rozwiązywania problemów. Najważniejsze zagadnienia: Podstawy języka: struktury danych, pętle, funkcje i obiekty Zarządzanie środowiskiem, testowanie i debugowanie kodu Praca z bazami danych (SQL, NoSQL) i plikami Tworzenie aplikacji sieciowych i API (między innymi FastAPI, Flask) Nowoczesne trendy: sztuczna inteligencja i data science Optymalizacja wydajności i współbieżność (asyncio, Mojo) Spis treści: Wstęp Część I. Twierdza Rozdział 1. Wprowadzenie Zagadki Kilka małych programów Konfiguracja Instalacja Pythona Aktualizacja Pythona Uruchomienie Pythona Interaktywny interpreter Pliki Pythona Wbudowane funkcjonalności Pythona Standardowa biblioteka Pythona Pakiety zewnętrzne Większy program Powtórka/zapowiedź Rozdział 2. Typy i zmienne Komputer Bity i bajty Wielobajtowe typy danych Zmienne Przypisywanie wartości do zmiennej Zmiana wartości zmiennej Usuwanie zmiennych Nazwy zmiennych Stosowanie konwencji nazewnictwa Typy danych Określanie wartości Obiekty - jak plastikowe pudełka w pamięci Powtórka/zapowiedź Do zrobienia Rozdział 3. Liczby Typ logiczny Typ całkowity Literały Działania Zmienne Kolejność działań Podstawa systemu liczbowego Konwersja typów Jak duża może być liczba całkowita? Typ zmiennoprzecinkowy Typ zmiennoprzecinkowy nie jest dokładny Ułamki Ułamki dziesiętne Funkcje matematyczne Powtórka/zapowiedź Do zrobienia Rozdział 4. Ciągi znaków Tworzenie ciągu znaków za pomocą cudzysłowów i apostrofów Tworzenie ciągu za pomocą funkcji str() Ucieczka ze znakiem \ Łączenie ciągów za pomocą znaku + Powielanie ciągu za pomocą znaku * Wyodrębnianie znaku za pomocą nawiasów [] Wyodrębnianie fragmentu ciągu za pomocą wycinka Określanie długości ciągu za pomocą funkcji len() Dzielenie ciągu za pomocą funkcji split() Łączenie ciągów za pomocą funkcji join() Zastępowanie fragmentów ciągu za pomocą funkcji replace() Przedrostki i przyrostki Przycinanie ciągu za pomocą funkcji strip() Przeszukiwanie i wybieranie ciągów znaków Wielkości liter Wyrównywanie ciągu znaków Formatowanie ciągów znaków Formatowanie w starym stylu za pomocą znaku % Formatowanie w starym stylu za pomocą znaków {} i funkcji format() Najnowszy styl formatowania: f-string Powtórka/zapowiedź Do zrobienia Rozdział 5. Struktury bytes i bytearray Bajty Tworzenie bajtów za pomocą cudzysłowów i apostrofów Tworzenie bajtów za pomocą funkcji bytes() Tworzenie bajtów z ciągu znaków szesnastkowych Dekodowanie i kodowanie bajtów i ciągów znaków Przekształcanie w ciąg szesnastkowy Odczytanie jednego bajta za pomocą nawiasów kwadratowych Wyodrębnianie wycinka Łączenie za pomocą znaku + Powielanie za pomocą znaku * Tablica bajtów Tworzenie za pomocą funkcji bytearray() Odczytanie jednego bajta za pomocą nawiasów kwadratowych Wyodrębnianie kilku bajtów za pomocą wycinka Zmiana jednego bajta za pomocą nawiasów kwadratowych Zmiana więcej niż jednego bajta za pomocą metody replace() Zmiana więcej niż jednego bajta za pomocą wycinka Wstawianie bajta za pomocą metody insert() Dołączanie jednego bajta za pomocą append() Dołączanie więcej niż jednego bajta za pomocą extend() Łączenie za pomocą znaku + Powielanie za pomocą znaku * Powtórka/zapowiedź Do zrobienia Rozdział 6. If i match Komentowanie za pomocą znaku # Kontynuacja wiersza za pomocą znaku \ Sprawdzanie za pomocą instrukcji if, elif i else Co oznacza True? Wielokrotne sprawdzanie za pomocą operatora in Nowość: operator walrus Instrukcja match Proste dopasowania Dopasowania strukturalne Powtórka/zapowiedź Do zrobienia Rozdział 7. Pętle while i for Powtarzanie operacji za pomocą instrukcji while Przerywanie pętli za pomocą instrukcji break Powrót na początek pętli za pomocą instrukcji continue Sprawdzanie przerwania pętli za pomocą instrukcji else Iterowanie za pomocą instrukcji for i in Przerywanie pętli za pomocą instrukcji break Powrót na początek pętli za pomocą instrukcji continue Sprawdzanie przerwania pętli za pomocą instrukcji else Generowanie sekwencji liczb za pomocą funkcji range() Powtórka/zapowiedź Do zrobienia Rozdział 8. Krotki i listy Krotki Tworzenie krotek za pomocą przecinków i nawiasów Tworzenie krotek za pomocą funkcji tuple() Odczytywanie elementu za pomocą nawiasów kwadratowych i indeksu Łączenie krotek za pomocą znaku + Powielanie elementów krotki za pomocą znaku * Porównywanie krotek Iterowanie krotek za pomocą instrukcji for i in Modyfikowanie krotek Listy Tworzenie list za pomocą nawiasów kwadratowych Tworzenie i przekształcanie list za pomocą funkcji list() Tworzenie list z ciągów za pomocą funkcji split() Odczytywanie elementu listy za pomocą nawiasów kwadratowych i indeksu Wyodrębnianie elementów listy za pomocą wycinków Dołączanie elementu do listy za pomocą funkcji append() Wstawianie elementu wewnątrz listy za pomocą funkcji insert() Powielanie elementów listy za pomocą znaku * Łączenie list za pomocą funkcji extend() i znaku + Modyfikowanie elementu listy za pomocą nawiasów kwadratowych i indeksu Modyfikowanie elementów listy za pomocą wycinka Usuwanie elementu listy za pomocą instrukcji del i indeksu Usuwanie elementu o zadanej wartości za pomocą funkcji remove() Odczytywanie i usuwanie elementu listy za pomocą funkcji pop() Usuwanie wszystkich elementów listy za pomocą funkcji clear() Wyszukiwanie elementu o zadanej wartości za pomocą funkcji index() Sprawdzanie zawartości listy za pomocą instrukcji in Zliczanie wystąpień wartości za pomocą funkcji count() Przekształcanie listy w ciąg znaków za pomocą funkcji join() Zmienianie kolejności elementów za pomocą funkcji sort() i sorted() Sprawdzanie długości listy za pomocą funkcji len() Przypisywanie listy zmiennej za pomocą znaku = Kopiowanie listy za pomocą funkcji copy() i list() oraz wycinka Kopiowanie zawartości listy za pomocą funkcji deepcopy() Porównywanie list Iterowanie listy za pomocą instrukcji for i in Iterowanie kilku list za pomocą funkcji zip() Iterowanie kilku list za pomocą funkcji zip_longest() Tworzenie listy za pomocą wyrażenia listowego Listy list Krotki a listy Nie ma wyrażeń krotkowych Powtórka/zapowiedź Do zrobienia Rozdział 9. Słowniki i zbiory Słowniki Tworzenie słownika za pomocą nawiasów klamrowych Tworzenie słownika za pomocą funkcji dict() Przekształcanie struktury w słownik za pomocą funkcji dict() Dodawanie i zmienianie elementów słownika za pomocą nawiasów kwadratowych i klucza Odczytywanie wartości za pomocą nawiasów kwadratowych i klucza oraz funkcji get() Iterowanie elementów słownika za pomocą instrukcji for i in Odczytywanie długości słownika za pomocą funkcji len() Odczytywanie i aktualizacja słowników Usuwanie elementu słownika za pomocą instrukcji del i klucza Odczytywanie i usuwanie elementu słownika za pomocą funkcji pop() Usuwanie wszystkich elementów słownika za pomocą funkcji clear() Sprawdzanie dostępności klucza za pomocą instrukcji in Przypisywanie wartości za pomocą = Kopiowanie słownika za pomocą funkcji copy() Kopiowanie zawartości słownika za pomocą funkcji deepcopy() Porównywanie słowników Wyrażenia słownikowe Zbiory Tworzenie zbioru za pomocą funkcji set() lub nawiasów klamrowych Odczytywanie długości zbioru za pomocą funkcji len() Dodawanie elementów do zbioru za pomocą funkcji add() Usuwanie elementów zbioru za pomocą funkcji remove() Łączenie zbiorów za pomocą | Iterowanie zbioru za pomocą instrukcji for i in Sprawdzanie dostępności elementu za pomocą instrukcji in Kombinacje wartości i operatory Wyrażenia zbiorowe Tworzenie niemutowalnych zbiorów za pomocą funkcji frozenset() Powtórka/zapowiedź Do zrobienia Rozdział 10. Funkcje Definiowanie funkcji za pomocą instrukcji def Wywołanie funkcji z nawiasami Argumenty i parametry Wartość None jest przydatna Argumenty pozycyjne Argumenty nazwane Domyślne wartości parametrów Rozbijanie/zbieranie argumentów pozycyjnych za pomocą znaku * Rozbijanie/zbieranie argumentów nazwanych za pomocą znaków ** Stosowanie wyłącznie argumentów nazwanych (*) i wyłącznie pozycyjnych (/) Argumenty mutowalne i niemutowalne Komentarze dokumentacyjne Funkcje jako typy pierwszoklasowe Argumenty funkcji nie są krotkami Funkcje wewnętrzne Domknięcia Funkcje anonimowe: wyrażenia lambda Generatory Funkcje generatorowe Wyrażenia generatorowe Dekoratory Przestrzenie nazw i zakresy widoczności Podwójne znaki podkreślenia w nazwach Rekurencja Funkcje asynchroniczne - krótkie wprowadzenie Wyjątki Obsługiwanie wyjątków za pomocą instrukcji try i except Instrukcja finally Definiowanie własnych wyjątków Powtórka/zapowiedź Do zrobienia Czym jest obiekt? Rozdział 11. Obiekty Czym jest obiekt? Proste obiekty Definiowanie klasy Atrybuty Metody Inicjacja obiektu Dziedziczenie klas Dziedziczenie klasy nadrzędnej Nadpisywanie metod Dodawanie metod Odwołanie do klasy nadrzędnej za pomocą metody super() Dziedziczenie wielu klas Domieszki Argument self Dostęp do atrybutów Dostęp bezpośredni Gettery i settery Dostęp do atrybutów za pośrednictwem właściwości Właściwości zwracające wyliczane wartości Prywatność dzięki modyfikacji nazwy Atrybuty klas i obiektów Rodzaje metod Metody instancji Metody klasy Metody statyczne Kacze typowanie Magiczne metody Agregowanie i komponowanie klas Kiedy stosować obiekty, a kiedy inne struktury? Nazwane krotki Klasy danych Pakiet attrs Powtórka/zapowiedź Do zrobienia Rozdział 12. Moduły i pakiety Moduły i instrukcja import Importowanie modułu Importowanie modułu z przemianowaniem Importowanie tylko tego, co jest potrzebne Pakiety Ścieżka wyszukiwania modułów Importowanie względne i bezwzględne Przestrzenie pakietów Moduły a obiekty Przydatne rzeczy w standardowej bibliotece Pythona Obsługa brakujących kluczy za pomocą funkcji setdefault() i defaultdict() Zliczanie elementów za pomocą klasy Counter Porządkowanie elementów według klucza za pomocą klasy OrderedDict Stos + kolejka == deque Iterowanie struktur danych za pomocą modułu itertools Wartości losowe Więcej narzędzi: zewnętrzny kod Powtórka/zapowiedź Do zrobienia Część II. Środowisko programistyczne Rozdział 13. Środowisko programistyczne Skąd wziąć kod? Instalowanie pakietów Program pip Menedżer pakietów Instalacja plików źródłowych Środowiska wirtualne Programy virtualenv i venv Program pipenv Program Poetry Program Conda Program uv Środowiska IDE IPython Jupyter Notebook JupyterLab Kontrola wersji kodu Mercurial Git Powtórka/zapowiedź Do zrobienia Rozdział 14. Wskazówki typów i dokumentacja Wskazówki typów Wskazówki typów dla zmiennych Wskazówki typów dla funkcji Mypy Dokumentacja Komentarze Komentarze dokumentacyjne Pliki tekstowe z językiem znaczników Powtórka/zapowiedź Do zrobienia Rozdział 15. Testowanie Pakiet pylint Pakiet ruff Pakiet unittest Pakiet doctest Pakiet pytest Przykłady Funkcje fixture Parametryzacja Pakiet Hypothesis Program Nox Ciągła integracja Powtórka/zapowiedź Do zrobienia Rozdział 16. Diagnostyka kodu Instrukcja assert Funkcja print() F-string Funkcja pprint() Pakiet IceCream Dekoratory Rejestrowanie komunikatów o błędach Moduł pdb Funkcja breakpoint() Powtórka/zapowiedź Do zrobienia Część III. Pojedynki Rozdział 17. Dane tekstowe Dane tekstowe - kodowanie Unicode Kodowanie Unicode w Pythonie Schemat UTF-8 Kodowanie znaków Dekodowanie znaków Kody HTML Normalizowanie znaków Dane tekstowe - wyrażenia regularne Wyszukiwanie dokładnego początkowego dopasowania za pomocą funkcji match() Wyszukiwanie pierwszego dopasowania za pomocą funkcji search() Wyszukiwanie wszystkich dopasowań za pomocą funkcji findall() Dzielenie ciągu według dopasowań za pomocą funkcji split() Zastępowanie dopasowań za pomocą funkcji sub() Wzorce Znaki specjalne Wzorce: specyfikatory Określanie formatu wyniku funkcji Powtórka/zapowiedź Do zrobienia Rozdział 18. Dane binarne Konwertowanie danych binarnych za pomocą modułu struct Inne narzędzia do przetwarzania danych binarnych Konwertowanie bajtów i ciągów znaków za pomocą modułu binascii Operatory bitowe Powtórka/zapowiedź Do zrobienia Rozdział 19. Data i czas Rok przestępny Moduł datetime Moduł time Odczytywanie i wyświetlanie daty i czasu Wszystkie przekształcenia Alternatywne moduły Powtórka/zapowiedź Do zrobienia Rozdział 20. Pliki Zapisywanie i odczytywanie plików Tworzenie i otwieranie plików za pomocą funkcji open() Zapisywanie danych tekstowych za pomocą instrukcji print() Zapisywanie danych tekstowych za pomocą instrukcji write() Odczytywanie pliku tekstowego za pomocą funkcji read(), readline() i readlines() Zapisywanie danych binarnych za pomocą funkcji write() Odczytywanie danych binarnych za pomocą funkcji read() Automatyczne zamykanie pliku za pomocą instrukcji with Przesuwanie wskaźnika za pomocą funkcji seek() Mapowane pamięci Operacje na plikach Sprawdzanie dostępności pliku za pomocą funkcji exists() Sprawdzanie rodzaju elementu za pomocą funkcji isfile() Kopiowanie pliku za pomocą funkcji copy() Zmienianie nazwy pliku za pomocą funkcji rename() Tworzenie odnośników za pomocą funkcji link() i symlink() Zmienianie uprawnień do pliku za pomocą funkcji chmod() Zmienianie właściciela pliku za pomocą funkcji chown() Usuwanie pliku za pomocą funkcji remove() Operacje na katalogach Tworzenie katalogu za pomocą funkcji mkdir() Usuwanie katalogu za pomocą funkcji rmdir() Odczytywanie zawartości katalogu za pomocą funkcji listdir() Zmienianie katalogu za pomocą funkcji chdir() Wyszukiwanie plików i katalogów za pomocą funkcji glob() Nazwy ścieżek Uzyskiwanie ścieżki za pomocą funkcji abspath() Uzyskiwanie ścieżki na podstawie symbolicznego odnośnika za pomocą funkcji realpath() Tworzenie ścieżki za pomocą funkcji os.path.join() Moduł pathlib Klasy BytesIO i StringIO Formaty plików - wykrywanie Powtórka/Zapowiedź Do zrobienia Rozdział 21. Dane w czasie, czyli procesy i współbieżność Programy i procesy Tworzenie procesu za pomocą modułu subprocess Tworzenie procesu za pomocą modułu multiprocessing Przerywanie procesu za pomocą funkcji terminate() Uzyskiwanie informacji systemowych za pomocą modułu os Uzyskiwanie informacji o procesie za pomocą pakietu psutil Automatyzacja poleceń Pakiet invoke Inne przydatne pakiety Współbieżność Kolejki Procesy Wątki Blokada GIL Moduł concurrent.futures Zielone wątki i biblioteka gevent Moduł twisted Biblioteka asyncio Koprocedury i pętle zdarzeń Alternatywy dla pakietu asyncio Asynchroniczność a. Asynchroniczne platformy i serwery Biblioteka Redis Nie tylko kolejki Powtórka/zapowiedź Do zrobienia Rozdział 22. Dane w przestrzeni, czyli sieć TCP/IP Gniazda sieciowe Narzędzie Scapy Narzędzie Netcat Wzorce komunikacji sieciowej Wzorzec "zapytanie-odpowiedź" Biblioteka ZeroMQ Inne narzędzia do przesyłania komunikatów Wzorzec "publikuj-subskrybuj" Serwer Redis Biblioteka ZeroMQ Inne narzędzia typu "publikuj-subskrybuj" Usługi internetowe Usługa DNS Moduły do obsługi poczty e-mail Inne protokoły Usługi WWW i interfejsy API Serializacja danych Moduł pickle Inne formaty serializacyjne Protokół RPC Protokół XML-RPC Protokół JSON-RPC Biblioteka MessagePack RPC Biblioteka zerorpc Biblioteka gRPC Narzędzia do zdalnego zarządzania Big Fat Data Hadoop Spark Disco Dask Chmury Amazon Web Services Google Cloud Microsoft Azure OpenStack Docker Kubernetes Powtórka/zapowiedź Do zrobienia Rozdział 23. Dane w pudełku, czyli trwałe zapisywanie Płaskie pliki tekstowe Tabelaryczne pliki tekstowe Format CSV Format XML Dane XML i bezpieczeństwo systemu Format HTML Format JSON Format YAML Format TOML Moduł tablib Pliki konfiguracyjne Pliki binarne Dopełniane pliki binarne i mapowanie pamięci Arkusze kalkulacyjne Format HDF5 Format TileDB Relacyjne bazy danych Język SQL Interfejs DB-API Baza SQLite Baza DuckDB Baza MySQL Baza PostgreSQL Biblioteka SQLAlchemy Inne pakiety do obsługi baz danych Bazy danych NoSQL Rodzina formatów dbm Baza Memcached Baza Redis Alternatywa dla Redis - Valkey Bazy dokumentowe Bazy danych czasowych Bazy grafowe Inne bazy NoSQL Bazy pełnotekstowe Wektorowe bazy danych Bazy danych geoprzestrzennych Powtórka/zapowiedź Do zrobienia Rozdział 24. Sieć WWW Podstawy internetu Testowanie HTTP Testowanie strony za pomocą programu telnet Testowanie strony za pomocą programu curl Testowanie strony za pomocą programu httpie Testowanie strony za pomocą programu httpbin Klienci internetowi Standardowe biblioteki WWW w Pythonie Moduł requests Inne klienty internetowe Serwery WWW Najprostszy serwer WWW Interfejs WSGI Interfejs ASGI Serwer Apache Serwer NGINX Inne serwery WWW dla języka Python Frameworki dla serwerów WWW Framework Bottle Framework Flask Framework Django Framework FastAPI Litestar Frameworki bazodanowe Usługi WWW i automatyzacja Moduł webbrowser Moduł webview Interfejsy API i REST Protokół WebSockets Metoda webhook Frontendy webowe Biblioteka htmx Framework FastHTML Surfowanie i drapanie Scrapy BeautifulSoup Moduł requests-html Obejrzyjmy film Powtórka/zapowiedź Do zrobienia Rozdział 25. Nauka o danych Standardowa biblioteka Pythona Konwersja formatów Funkcje matematyczne Liczby zespolone Precyzja obliczeń i moduł decimal Działania na ułamkach zwykłych Klasa array, czyli spakowana sekwencja wartości Prosta statystyka w module statistics Mnożenie macierzy Pakiet NumPy Tworzenie tablicy za pomocą funkcji array() Tworzenie tablicy za pomocą funkcji arange() Tworzenie tablicy za pomocą funkcji zeros(), ones() i random() Zmienianie kształtu tablicy za pomocą metody reshape() Odwoływanie się do elementów tablicy za pomocą nawiasów [] Działania na tablicach Algebra liniowa Biblioteka SciPy Biblioteka Pandas Biblioteka Polars Baza danych DuckDB Wizualizacja danych Powtórka/zapowiedź Do zrobienia Rozdział 26. AI Okazuje się, że. Systemy eksperckie Perceptrony Przełom Rozpoznawanie obrazów - ImageNet i AlexNet Duże modele językowe (LLM) ChatGPT Generowanie wspomagane wyszukiwaniem Agenty Wydajność Budowanie modeli - frameworki Pythona Obecne modele Miliony modeli - Hugging Face Przykłady z frameworkiem Ollama Instalacja narzędzia Ollama Wybór modelu Wybór innego modelu Materiały dotyczące narzędzia Ollama Źródła wiedzy Powtórka/zapowiedź Do zrobienia Rozdział 27. Wydajność Sprzęt komputerowy Pomiary czasu Moduł profile Algorytmy i struktury danych Tablice a listy i krotki Pamięć podręczna Cython NumPy i SciPy Rozszerzenia C lub Rust Taichi PyPy Numba Standardowy kompilator JIT Pythona Mojo Dlaczego powstał Mojo? Projekt Przykłady Ograniczenia Wnioski Powtórka/zapowiedź Do zrobienia Dodatek. Rozwiązania zadań O autorze: Bill Lubanovic to programista z ponad 40-letnim doświadczeniem. Pracował między innymi z Uniksem, sieciami i Pythonem dla takich firm jak Internet Archive, CrowdStrike czy Northwest Airlines. Jest autorem bestsellerowych książek, w tym Szybki jak FastAPI, i współautorem publikacji o administrowaniu Linuksem. Mieszka w górach w Minnesocie, gdzie nieustannie zgłębia nowe technologie.

Specyfikacja

Podstawowe informacje

Autor
  • Bill Lubanovic
Wydawnictwo
  • Helion
Okładka
  • Miękka
Rok wydania
  • 2026
Ilość stron
  • 579
Tematyka
  • Programowanie
  • Projektowanie
ISBN
  • 9788328940918
Model
  • 9788328940918