Jason. Cała informatyka w jednym miejscu!

W dniu dzisiejszym zrecenzuję dla Was drodzy czytelnicy książkę, która stała się fundamentem dla moich czterdziestu artykułów o Pythonie. Jest to "Python w zadaniach. Programowanie dla młodzieży. Poziom podstawowy". Ogółem, jest naprawdę w porządku dla każdego początkującego "Pythonowca". Wypatrzyłem w niej jednak sporo malutkich błędów i niedopracowań. Zapraszam wszystkich do recenzji, może ktoś z Was zastanawia się nad jej zakupem?

"PYTHON W ZADANIACH. PROGRAMOWANIE DLA MŁODZIEŻY. POZIOM PODSTAWOWY" SŁOWEM WSTĘPU

Bardzo długi ten tytuł, więc wybaczcie taki szeroki nagłówek. Książka składa się łącznie z 276 stron, jednak jeśli brać pod uwagę jedynie same konkrety (czyli treści tłumaczące poszczególne zagadnienia), takich stron ma 235. Dalej to już są tylko przykładowe rozwiązania zadań i tabelka dla zaznaczania sobie które z nich udało się zrobić samodzielnie. Prezentuje ona podstawowe zagadnienia ze składni tytułowego języka takie jak operatory, łańcuchy znaków, instrukcje warunkowe czy pętle "while" i "for". W dalszej części książki jest już wypróbowywanie poszczególnych pakietów i modułów. Niektóre z nich są wbudowane, inne z kolei wymagają zainstalowania poprzez "pip", co zresztą jest napisane na samym początku czytania.

"Python w zadaniach. Programowanie dla młodzieży. Poziom podstawowy" został podzielony na rozdziały, a w każdym z nich są do wykonania proste zadania dla początkujących mające na celu pomóc czytelnikowi w nabyciu tych najbardziej fundamentalnych umiejętności w zakresie korzystania z Pythona. Zadania nie są umieszczane na końcu rozdziału, tylko występują jeden po drugim w trakcie jego czytania. Zamiast nich, na samym końcu występuje nagłówek "Podsumowanie" po którym napisane jest czego powinniśmy się nauczyć z konkretnego rozdziału oraz parę pytań na które możemy sobie odpowiedzieć. Występuje 21 rozdziałów i każdy z nich jest odrębnym tematem. W jednym instalujemy Pythona, w innym zaś uczymy się podstaw rysowania obrazków na ekranie przy pomocy "pygame".

Oprócz zadań zwykłych, są też tzw. "powtórzeniowe" umieszczone w kolejnym rozdziale, które sprawdzają co zapamiętaliśmy z poprzedniego. Pojawiają się one przed rozpoczęciem każdego nowego rozdziału. Niektóre z zadań są tylko z nazwy, gdyż mają pod treścią zamieszczoną odpowiedź, ale w to nie wnikam, bo może uznano je za zbyt trudne do samodzielnego napisania (to w końcu programowanie dla młodzieży).

"Python w zadaniach. Programowanie dla młodzieży. Poziom podstawowy"

"Python w zadaniach. Programowanie dla młodzieży. Poziom podstawowy" to zbiór 21 rozdziałów przedstawiających najbardziej podstawowe tematy korzystania z Pythona jak również demonstracje możliwości niektórych pakietów czy modułów.

To tyle na streszczenie zawartości, a teraz ważniejsza część czyli pozostawione błędy językowe i kodowe.

WYKRYTE BŁĘDY

Zostawię tę adnotację na wszelki wypadek. Nie mam żadnego zamiaru kpić sobie z twórców czy wytykać palcami jacy oni są niedobrzy, że jakiś błąd zostawili. Ta część artykułu ma tylko na celu sprostowanie wielu szczegółów, które zostały przeze mnie zanotowane podczas czytania. Gotowi? Oto one:

GALIMATIAS Z "PYDUB"

Pamiętacie pakiet "pydub"? Ma to do siebie, że użytkownicy systemu operacyjnego Windows mogą mieć dodatkowe problemy z jej prawidłowym działaniem, bo nie dość, że trzeba było w moim przypadku zainstalować "simpleaudio", to jeszcze zamontować "Microsoft C++ Build Tools"! Natrafiliście na ten sam problem co ja? To niestety nie dowiecie się o nim w tej książce. Prawda jest taka, że samodzielnie musiałem znaleźć przyczynę powstałego problemu i poszperać na forach jak można temu zaradzić. Dopiero wtedy po późniejszych ustaleniach dowiedziałem się, że posiadacze Windowsa mogą doświadczyć braku odtwarzania jakiegokolwiek dźwięku, mimo prawidłowego zapisu kodu źródłowego i bezproblemowego uruchomienia skryptu. W książce "Python w zadaniach. Programowanie dla młodzieży. Poziom podstawowy" nie ma ani słowa o takim przypadku.

"PROGRESSBAR" TRZEBA NAJPIERW ZAINSTALOWAĆ

Rozdział #10 ("Zmienne tablicowe (listy)") zawiera w sobie podpunkt dotyczący obsługi pakietu "progressbar". Na samym początku książki natomiast, znajduje się lista pakietów jakie trzeba ręcznie zainstalować przy pomocy systemu zarządzania pakietami "pip". Jest na niej "pygame", "PyQt5", "moviepy" oraz "easygui"...ale brak "progressbar"! A "progressbar" też nie należy do standardowej biblioteki Pythona (trzeba go zainstalować ręcznie). Delikatne niedopatrzenie, każdemu może się zdarzyć.

NIEWŁAŚCIWE PODEJŚCIE DO PĘTLI GRY "PYGAME"

W rozdziale #11 ("Biblioteka "pygame"") omawia się szczegóły na temat tworzenia podstawowego okna w "pygame". Bardzo nie spodobało mi się podejście w pierwszym przykładzie. Zerknijcie na to:

import pygame

okno = pygame.display.set_mode([200, 100])

pygame.display.set_caption("Hello world")

Gra zawsze działa w środku pętli, nieważne w jakiej. Ale tutaj żadnej pętli nie ma! Sprawdziłem ten kod w praktyce. Okno się pojawia, zostaje w miejscu jak przy pętli, ale próba zamknięcia tego okna w sposób normalny już jest niemożliwa, bo okno nie zostało zaprogramowane na okoliczność przechwytywania sygnału zamknięcia, o którym pisałem. Żeby okno nie zniknęło w mgnieniu oka, pomija się metodę "quit", co jest kompletnie niespotykanym zachowaniem! Efekt końcowy jest taki, że pojawia się okno, dochodzi do zakończenia programu w trakcie wyświetlania tego okna z powodu braku pętli, a jego samego nie można zamknąć, bo jest brak przechwytywania zdarzeń.

Przykład ten łamie podstawowe normy jakich wymaga użycie pakietu "pygame". Raz, to jest inicjalizacja pakietu metodą "init". Dwa, to jest pętla. Trzy, przechwytywanie sygnałów zdarzeń. Cztery, brak na samym końcu "zdjęcia" zasobów przeznaczonych na powstałe okno, czyli "pygame.quit". Dodam, że ani "init", ani "quit" nie ma w żadnym innym kolejnym przykładzie, a powinny być! Ja testowałem to akurat na domyślnym IDE do Pythona zwanym "IDLE", być może inne środowiska programistyczne nie reagują tak brutalnie na powyższe braki.

Drugą sprawą już mniej istotną jest stosowanie praktyki "usypiania" wątku w celu zatrzymania zmian zachodzących w programie. Nie robi się w ten sposób! Powinno się dodać osobny czasomierz i do licznika dodawać deltę z czasu (ang. "delta time"). W zadaniu #83 możecie natrafić na wspomniany przypadek.

POMYŁKA PRZY NUMERACJI

Trafiliście na stronę #102? W treści zadania nr. 65 jest pokręcona numeracja i prawdopodobnie chodziło o zadanie #63. Spoko, zdarza się. Wspominam o tym, żebyście się nie dziwili tak samo, jak ja.

POMYŁKI W PRZYKŁADOWYCH KODACH ŹRÓDŁOWYCH

Lektura "Python w zadaniach. Programowanie dla młodzieży. Poziom podstawowy" zawiera w sobie parę pomyłek w kodach źródłowych, które postanowiłem Wam je przybliżyć, tylko po to abyście na nie uważali podczas ich śledzenia i studiowania.

Na stronie #160 znajduje się przykład korzystania z klauzuli "finally" dla przechwytywania wyjątków. Posiada niestety jeden drobny błąd dotyczący minimalnego zakresu funkcji "range" w pętli "for" sczytującej argumenty tablicy. W funkcji jest od 1 do 10, a powinno być od 0 do 10, gdyż argumenty listy liczone są od zera. Dziesięć akurat jest w porządku, bo "range" nie uwzględnia ostatniej liczby podanej w drugim parametrze. Zatem, program nie wypisuje nigdy pierwszego argumentu.

Zadanie powtórzeniowe z numerem 14 umieszczone na samym początku rozdziału #18 ("Wątki") też posiada podobny błąd dotyczący zakresu. Jest tam funkcja "len" która, jak dobrze wiemy, zwraca między innymi długość listy. Aby "dopasować" ją do funkcji "randint" z modułu "random", należy od wartości odjąć jedynkę przez wzgląd na zerowy argument. Tutaj tego nie ma! Następuje losowanie z zakresu od 0 do długości listy, przez co istnieje ryzyko wyjścia poza listę i zgłoszenia wyjątku.

Trzeci przypadek wykryłem w jednym z przykładów przed zadaniem #138, ale to już naprawdę pierdoła. Występuje nieużywana zmienna "punkty", potrzebna do wykonania zadania poprzedniego. Za to kod źródłowy podany w kroku .11 ostatniego rozdziału ("Projekt gry") ma już dwa błędy składniowe. Po pierwsze, następuje odwołanie do obiektu w taki sposób, jakby występował w klasie, w której obiekt występuje, a znajduje się w parametrze! Krótko pisząc, miało być "x", a nie "self.x". Drugi błąd polega na próbie dostania się do obiektu, do którego nie ma dostępu, bo znajduje się w innej klasie! Nie chcę tak bardzo iść w szczegóły, aby nie zdradzać całej książki. Dojdźcie do dziesiątego kroku w ostatnim rozdziale, a zrozumiecie o co biega. Pomogło mi przeniesienie odpowiedniego fragmentu kodu do pewnej klasy.

"CONCURRENT"? JEDNAK "CONCURRENT.FUTURES"!

Niewielkie mylenie nazw, ale też zwróciło moją uwagę. W rozdziale #18 jest mowa o "concurrent", pakiecie przeznaczonym do programowania współbieżnego. Tylko później w kodach źródłowych widać import modułu "concurrent.futures", nie samego "concurrent"! Zatem, mówi się o pakiecie "concurrent", ale zadania dotyczą korzystania z jego modułu. Nie ma żadnego zdania na temat tego, że trzeba importować "concurrent.futures"!

BRAK UPRZEDZENIA O PROBLEMACH PODCZAS ODTWARZANIA FILMU PRZEZ "MOVIEPY"

"Python w zadaniach. Programowanie dla młodzieży. Poziom podstawowy" pisze o "moviepy" zaraz po wątkach, w rozdziale dziewiętnastym. Pierwszy przykładowy kod przedstawia jak odtworzyć filmik o podanej nazwie korzystając z Pythona. Nie uprzedzono mnie jednak o konsekwencjach. Gdy dojdzie do wywołania "preview", okno się zawiesza i stawia opór przed zamknięciem poprzez kliknięcie krzyżyka. Musiałem wyjść z tego awaryjnie zamykając całe okno powłoki, ewentualnie "Zakończ proces" przez menedżer zadań.

Ten przypadek jestem w stanie zrozumieć, bo twórcy może nie testowali tego przy pomocy "IDLE". Możliwe, że w innych IDE ten problem nie występuje. Chociaż przydałoby się wtrącić zdanie, że mogą być tego typu problemy, bo dla mnie to było zaskoczenie. Nieprzyjemne, gwoli ścisłości.

CZY KSIĄŻKA JEST WARTA ZAKUPU?

Zależy. Jeśli zaczynacie kompletnie od zera i programowanie jest dla Was obcą planetą, to tak. "Python w zadaniach. Programowanie dla młodzieży. Poziom podstawowy" ma swoje wady, ale to są szczegóły, które wychwycą tylko ludzie mający już jakieś doświadczenie w programowaniu. Jednak jeśli już umiecie jakiś język i chcielibyście opanować Pythona jako następny, to są bardziej obszerne lektury o samym Pythonie i tę książkę już bym sobie odpuścił. Kupiłem ją z ciekawości, żeby zobaczyć czyiś punkt widzenia jakie według twórców są tematy przeznaczone dla początkujących. Tym bardziej, że ja sam dopiero się uczę Pythona. Składnia to nie wszystko!

Żeby nie było. W żaden sposób nie nazywam tego "szmalem wyrzuconym w błoto". Dzięki tej lekturze dowiedziałem się kilku przydatnych rzeczy. Najlepsza dla mnie nauka to jest kombinacja "Lewy Alt + klawisze numeryczne". Nie będę Wam zdradzać co to daje, aby nie ujawniać treści całkowicie. Nie znałem takiej kombinacji wcześniej ani jej zastosowania i poznałem ją dzięki tej książce. Oprócz tego, pochwała za brak nagminnie zostawianych literówek w tekście pisanym "po ludzku". W całej książce dostrzegłem tylko jedno jedyne "zjedzenie" litery pod sam koniec rozdziału o tworzeniu GUI (strona 221).


To wszystko, kochani! Jest to moja druga dopiero lektura informatyczna w życiu, przeczytana od deski do deski. Mimo wyżej wymienionych niepoprawnych w mojej ocenie kodów, dało się ją przyjemnie czytać i dla początkujących będzie to dobra pozycja. Jednak ludzie mający już jakieś pojęcie o Pythonie niech poszukają sobie innej pozycji. Przy tej będziecie się nudzić.

PODOBNE ARTYKUŁY