Podstawy programowania w Pythonie (czerwiec 2021)

Seria pytań uczestników, które pojawiły się podczas szkolenia Podstawy programowania w Pythonie realizowanego w dniach 7-11.06.2021 r.


Czy w Pythonie są zmienne prywatne?

Sam język Python nie oferuje modyfikatorów dostępu (private/public) znanych z języków takich jak C++, C#, Java. Istnieje jedynie KONWENCJA, że atrybuty (czyli zmienne w obiektach), których nazwy rozpoczynają się od _podkreślenia, NIE POWINNY być używane spoza klasy. Technicznie jednak kod spoza danej klasy ma dostęp do tych atrybutów. W przypadkach bardziej wymagających (np. tworzenie biblioteki programistycznej dla innych programistów) można aktywnie sprawdzać, czy ktoś nie próbuje modyfikować atrybutów i wyrzucać w takiej sytuacji wyjątek - da się to zrobić nadpisując metodę specjalną __setattribute__. "Zwykli" programiści Pythona nie wchodzą jednak w tak zaawansowane mechanizmy, tylko zakładają, że inni będą przestrzegać _konwencji.

Co to znaczy __name__ == '__main__' ? Czy to to samo, co funkcja main w innych językach?

Plik Pythona (nazwijmy go a.py) może być traktowany jak "program" (czasami mówi się jeszcze "skrypt") i uruchamiany bezpośrednio; może też być traktowany jak "moduł" i importowany z innych plików. Domyślnie gdy plik a.py jest importowany przez inny plik, to wszystkie polecenia z pliku a.py się wykonują. Często jednak chcemy, aby wczytane zostały tylko definicje funkcji, a polecenia już się nie wykonały. Właśnie wtedy te polecenia należy umieścić za warunkiem if __name__ == '__main__': Wykonają się one tylko gdy plik a.py zostanie uruchomiony jako program, a nie wykonają się, gdy plik a.py będzie importowany jako moduł przez inny plik. Działanie jest oparte o zmienną globalną __name__, którą Python aktualizuje podczas wczytywania modułów. To nie to samo, co funkcja main w C czy metoda main z Javy. 1) Plik Pythona może być traktowany jak program i uruchamiany także wtedy, gdy nie posiada konstrukcji __name__ == '__main__' (drobna uwaga do edytora PyCharm...) 2) Instrukcje umieszczone pod tym if-em nie stanowią osobnej funkcji. W szczególności zmienne tam definiowane mają status zmiennych globalnych. Osobiście definiuję osobną funkcję main i moje programy wyglądają tak. def main(): polecenia if __name__ == '__main__': main()

Skoro Python jest mało wydajny, to jakie są jego zalety?

Faktycznie Python (dokładnie: jego standardowy interpreter) około 50-100 razy wolniej niż języki "bajtkodowe" Java, Kotlin, C# i nawet 200 razy wolniej niż natywne C i C++ wykonuje operacje na liczbach. Dlaczego? 1) Python jest językiem interpretowanym 2) Wszystkie wartości, w tym liczby, są w Pythonie obiektami 3) Liczby typu int nie mają w Pythonie ograniczenia na wielkość i nie odpowiadają ściśle 32- lub 64-bitowym słowom procesora; "coś za coś". Jednak: 1) Innego typu operacje: na tekstach, plikach, strukturach danych typu lista/słownik, są już tylko nieznacznie (ok 2 razy) wolniejsze niż np. w Javie. 2) Do wykonywania większych obliczeń numerycznych, statystycznych, analizy danych, można w programach Pythona wykorzystać biblioteki takie jak numpy, scipy, pandas, które wewnętrznie korzystają z kodu natywnego i działają porównywalnie szybko, jak inne języki programowania. 3) Zaletą Pythona jest przede wszystkim wygodna składnia, umożliwiająca szybkie tworzenie czytelnych programów, oraz dostępność wielu gotowych rozwiązań, bibliotek, których łatwo można użyć w naszych programach.