jautājums |
atbilde |
Python proces wykonywania sākt mācīties
|
|
1) Analiza pod względem błędów, tłumaczenie na bajtkod 2) Maszyna wirtualna Python, pętla prog: 1) wczyt instr bajtkod, wykonuje instr w C, zarzadza stosem
|
|
|
|
sākt mācīties
|
|
Jest to zestaw instrukcji dla Maszyny Wirtualnej, a nie dla fizycznego procesora (CPU). Nazwa pochodzi stąd, że każda instrukcja (opcode) zajmowała tradycyjnie jeden bajt (choć w nowszych wersjach Pythona się to zmienia)
|
|
|
Interpreter W kontekście Pythona, sākt mācīties
|
|
zawiera w sobie zarówno kompilator do bajtkodu, jak i Maszynę Wirtualną (PVM). Jego zadaniem jest emulacja komputera – udaje procesor, który rozumie język bajtkodu Pythona.
|
|
|
|
sākt mācīties
|
|
udostępnia interfejs wysokopoziomowy do pracy z wątkami. Kluczowa cecha implementacyjna: Wątki w Pythonie są natywnymi wątkami systemu operacyjnego
|
|
|
GIL (Global Interpreter Lock) sākt mācīties
|
|
mutex (blokada wzajemnego wykluczania), wbudowany w rdzeń interpretera CPython, Aby jakikolwiek wątek mógł wykonać instrukcję bajtkodu Pythona lub operować na obiektach Pythona, musi najpierw uzyskać (zablokować) GIL
|
|
|
Lock (Blokada Wzajemnego Wykluczania) sākt mācīties
|
|
Ochrona Sekcji Krytycznej (zapobieganie Race Conditions).
|
|
|
|
sākt mācīties
|
|
Semafor to licznik sterujący dostępem do zasobów. Pozwala określonej liczbie wątków na jednoczesną pracę. wait() (P) zmniejsza licznik, signal() (V) go zwiększa. Gdy licznik wynosi 0, wątek czeka. Idealny do puli połączeń lub ograniczania obciążenia.
|
|
|
|
sākt mācīties
|
|
queue. Queue to bezpieczny wątkowo kanał komunikacji w Pythonie. Pozwala na bezpieczne przesyłanie danych między wątkami bez ręcznych blokad (Lock). Obsługuje mechanizm blokujący: get() czeka na dane, a put() może czekać na wolne miejsce.
|
|
|
|
sākt mācīties
|
|
Mechanizm polimorfizmu parametrycznego umożliwiający tworzenie kodu (klas/funkcji) działającego na różnych typach danych, z zachowaniem bezpieczeństwa typów podczas analizy statycznej.
|
|
|
|
sākt mācīties
|
|
TypeVar to zmienna typologiczna używana do tworzenia generyków w Pythonie. Pozwala powiązać typy (np. zapewnić, że funkcja zwróci ten sam typ, który otrzymała). Umożliwia ograniczanie dopuszczalnych typów za pomocą argumentów lub parametru bound.
|
|
|
|
sākt mācīties
|
|
Adnotacja oznaczająca homogeniczną listę elementów typu T. W Pythonie 3.9+ zastępowana przez list[T]
|
|
|
|
sākt mācīties
|
|
Dict[K, V] to podpowiedź typu (type hint) dla słownika. K określa typ klucza, a V typ wartości. Od Pythona 3.9 zaleca się zapis dict[K, V]. Pomaga w autouzupełnianiu kodu i pozwala na szybsze wykrywanie błędów przez analizatory.
|
|
|
|
sākt mācīties
|
|
id(<zmienna>) zwraca identyfikator obiektu, na który wskazuje <zmienna>. Pozwala to na sprawdzenie czy 2 różne zmienne wskazują na ten sam obiekt.
|
|
|
|
sākt mācīties
|
|
Tworzy nowy kontener, ale wypełnia go starami referencjami do dzieci
|
|
|
|
sākt mācīties
|
|
Tworzy nowy kontener i rekurencyjnie nowe kopie wszystkich dzieci.
|
|
|
|
sākt mācīties
|
|
Przypisanie (=), Płytka Kopia (copy. copy(), [:]), Głęboka Kopia (copy. deepcopy())
|
|
|
Hermetyzacja w Pythonie (Encapsulation) sākt mācīties
|
|
Brak słów kluczowych private/protected. Ochrona opiera się wyłącznie na konwencji (_name) oraz mechanizmie Name Mangling (__name)(trudniej nadpisac), a nie na blokadzie dostępu
|
|
|
|
sākt mācīties
|
|
Oznacza atrybut chroniony (umownie). Technicznie jest publiczny, ale sygnalizuje programiście: "nie dotykaj spoza klasy"
|
|
|
|
sākt mācīties
|
|
Uruchamia mechanizm Name Mangling. Interpreter zmienia nazwę na _Klasa__zmienna w czasie kompilacji. Służy do unikania kolizji nazw przy dziedziczeniu, a nie do bezpieczeństwa danych
|
|
|
|
sākt mācīties
|
|
mplementacja Protokołu Deskryptora. Pozwala zamienić metody (getter/setter) na atrybuty dostępne przez kropkę (obj.x), zachowując kompatybilność API bez zmiany kodu klienta
|
|
|
|
sākt mācīties
|
|
Specjalny typ, w którym wszystkie pola dzielą ten sam obszar pamięci. Rozmiar: Równy największemu polu. W danej chwili można przechowywać tylko jedną wartość. Zastosowanie: Oszczędność pamięci lub dostęp do tych samych danych na różne sposoby.
|
|
|
|
sākt mācīties
|
|
Typ wyliczeniowy przypisujący nazwy (symbole) do liczb całkowitych. Przykład: enum Kolor {RED, GREEN, BLUE}; (domyślnie 0, 1, 2). Zaleta: Poprawa czytelności kodu i bezpieczeństwo typów (zwłaszcza enum class w nowoczesnym C++).
|
|
|
|
sākt mācīties
|
|
Uporządkowana, zmienna (mutable) kolekcja elementów. Pozwala na duplikaty. Zapis: [1, 2, 2, 3] Cechy: Dostęp przez indeks, dynamiczny rozmiar, bardzo uniwersalna.
|
|
|
|
sākt mācīties
|
|
Uporządkowana, niezmienna (immutable) kolekcja. Pozwala na duplikaty. Zapis: (1, 2, 2, 3) Cechy: Szybsza od listy, bezpieczniejsza (brak zmian), może być kluczem w słowniku.
|
|
|
|
sākt mācīties
|
|
Nieuporządkowana kolekcja unikalnych elementów. Zapis: {1, 2, 3} Cechy: Automatycznie usuwa duplikaty. Bardzo szybkie sprawdzanie przynależności (operator in).
|
|
|
|
sākt mācīties
|
|
in, not in: sprawdzenie czy element jest w kolekcji. +: łączenie list/krotek. *: powielanie kolekcji (np. [0] * 3 -> [0, 0, 0]). ==: sprawdzenie czy kolekcje mają tę samą zawartość. is: sprawdzenie identyczności (ten sam obiekt).
|
|
|
|
sākt mācīties
|
|
Polimorficzny opakowywacz (wrapper) na wszystko, co można wywołać: zwykłe funkcje, lambdy, funktory. Składnia: std: function<typ_zwracany(argumenty)>. Zastosowanie: Pozwala przechowywać różne obiekty funkcyjne w jednej zmiennej/kontenerze.
|
|
|
Relacja: Lambda a std: function sākt mācīties
|
|
Lambda to konkretny obiekt o nieznanym typie wygenerowany przez kompilator. std: function to kontener, który może tę lambdę przechować, ale wiąże się to z niewielkim narzutem wydajnościowym (dynamiczna alokacja).
|
|
|
|
sākt mācīties
|
|
Bufor: tymczasowy obszar RAM do przechowywania danych w przesyle. Pula (Pool): wstępnie zaalokowany blok pamięci, z którego program sam wydziela małe porcje. Zaleta: Szybsze działanie i brak fragmentacji RAM niż przy ciągłym new/malloc.
|
|
|
|
sākt mācīties
|
|
Funkcja wypełniająca blok pamięci określoną wartością (bajt po bajcie). Użycie: memset(ptr, 0, sizeof(ptr)). Zastosowanie: Najszybszy sposób na "wyzerowanie" tablicy lub struktury zaraz po jej utworzeniu.
|
|
|
|
sākt mācīties
|
|
kopiuje blok danych z adresu A do B. Bardzo szybka, ale niebezpieczna, gdy obszary na siebie nachodzą. memmove: bezpieczniejsza wersja, która radzi sobie z nachodzącymi na siebie obszarami pamięci (używa bufora pomocniczego).
|
|
|
|
sākt mācīties
|
|
Mechanizm automatycznego zwalniania pamięci zajmowanej przez obiekty, które nie są już używane przez program. Zaleta: Zapobiega wyciekom pamięci (memory leaks). Wada: Może powodować nagłe, krótkie pauzy w działaniu programu.
|
|
|
|
sākt mācīties
|
|
Zasady Pozwala definiować działanie operatorów dla własnych typów. Ograniczenia: Nie można tworzyć nowych symboli (np. **), zmieniać priorytetów ani liczby argumentów. Przynajmniej jeden argument musi być typem użytkownika.
|
|
|
Adnotacje typów (Type Hints) sākt mācīties
|
|
Opcjonalne deklaracje typów: zmienna: typ = wartosc. Zasada: Ignorowane przez interpreter Pythona, ale używane przez IDE i analizatory (np. mypy) do wykrywania błędów przed startem. Zwiększają czytelność kodu.
|
|
|