Pytania twarde z rozmów Python Flashcards
HTTP
HTTP to skrót od Hypertext Transfer Protocol i jest to główny protokół używany współcześnie w przegladarkach.
Jest to protokół bezstanowy, tzn. ani serwer (ani klient) nie przechowuje informacji o tym, jakie były wcześniej zapytania pomiędzy określonym serwerem i klientem oraz nie posiada stanu wewnętrznego
W zapytaniach HTTP możemy wyróżnić dwa elementy: nagłówek i ciało.
Nagłówek ma minimum 1 wiersz, który określa metodę HTTP, adres URI oraz wersję protokołu HTTP (obecnie korzystamy z wersji 1.1, oznaczanej w nagłówku jako HTTP/1.1 ). Przykładowy pierwszy wiersz nagłówka wygląda nastepująco:
GET / HTTP/1.1
Gdzie:
GET — to nazwa metody HTTP
/ — to tzw. URI, czyli ta część adresu, który wystepuje po domenie
HTTP/1.1 — okreslenie protokołu, tutaj HTTP w wersji 1.1
Metody HTTP:
GET
Pobieranie zasobu lub jego wyświetlenie, np. wyświetlenie formularza lub strony. Parametry można przekazywac jedynie poprzez adres (np. ?nazwa=wartosc&nazwa2=wartosc2)
Metody HTTP:
POST
Przesłanie danych zapisanych jako pary klucz-wartość do serwera (np. wysłanie formularza, gdzie kluczem jest nazwa danego pola a wartością wpisana przez nas wartość). Metoda ta pozwala przesyłać także pliki (a także wiele pliki oraz pary klucz-wartość jednocześnie). Parametry są przekazywane w ciele zapytania, można także przekazywać parametry poprzez adres (tak jak w metodzie GET)
Metody HTTP:
PUT
Zastępowanie pełnego zasobu danych. Post wymaga, by w ciele żądania znajdował się komplet danych umożliwiających utworzenie całego obiektu po stronie serwera.
Metody HTTP:
DELETE
Usuwanie zasobu na serwerze, z racji bezpieczeństwa praktycznie zawsze jest wyłaczona domyślnie. Obecnie używana głównie w przypadku RESTowych serwisów, wskazując, że dany zasób ma być usunięty (i obsługiwany przez aplikację, a nie sam serwer).
Metody HTTP:
HEAD
Analogiczny do zapytania GET, z tym wyjątkiem, że nie zwraca ciała (zawartości). Służy do pobrania metdanych o zasobie w postaci nagłówków HTTP. Dla danego adresu zwraca same nagłówki.
Czym jest Mockowanie?
Mock to obiekt pomocniczy, którego używa się zamiast rzeczywistej implementacji w trakcie testów.
Atrapa obiektu (ang. mock object) – symulowany obiekt, który w kontrolowany sposób naśladuje zachowanie rzeczywistego obiekt
Pozwala on na określenie jakich interakcji spodziewamy się w trakcie testów. Następnie można sprawdzić czy spodziewane interakcje rzeczywiście wystąpiły
Np
- symulacja odpowiedzi z serwisów
- symulowanie konkretnych wartości zwracanych przez aplikację
- mockowanie obiektów klas, z którymi wchodzimy w interakcję
Co to jest paradygmat programowania?
Paradygmaty programowania – to różne sposoby, w których dany program lub język programowania może być zorganizowany. Każdy paradygmat składa się z pewnych struktur, cech i opinii na temat tego, jak należy rozwiązywać typowe problemy programistyczne.
generator Pythona
GENERATOR to funkcja, która zwraca iterator.
Zwróci po 1 wartości przy każdym uruchomieniu.
Można rozpoznać generator po słowie
yield, a także next.
Słowo yield informuje interpreter, że ta funkcja jest generatorem
Funkcja next zwraca obiekt generatora przy każdym użyciu, jednak zamiast powtarzać next kilkukrotnie w kodzie można go umieścić w pętli for
Jeśli przekroczymy liczbę iteracji podczas używania generatora to otrzymamy StopIteration error
dekorator Pythona
DEKORATORY - to funkcje, które za argumenty przyjmują inne funkcje i modyfikują ich działanie albo coś do niej dodaje (dekoruje ją)
lambda
LAMBDA nazywana jest też funkcją anonimową, często używa się ją jako argumentu dla innych funkcji takich jak sorted(), map() czy filter()
Piszemy wtedy key = lambda X: X+2.
list comprehension
po polsku tłumaczy się je jako wyrażenia listowe (choć na nazwa nie jest w powszechnym użyciu)
list comprehension to bardzo lubiany przez programistów mechanizm pozwalający tworzyć listy w jednej linijce
Przykłady:
[x for x in range(5)]
> [0, 1, 2, 3, 4]
Możemy tam odnosić do innych list np.
L = [1,2,3,4,5,6]
L1 = [x**2 for x in L]
> [1, 4, 9, 16, 25, 36]
Możemy również w tych wyrażeniach umieszczać for, if, czy wyrażenia boolean
[x for x in L if x % 2 == 0]
Istnieje także dict comprehension, które umieszczamy w nawiasach wąsatych.
L = [1,2,3,4,5,6]
D1 = {x:x % 2 == 0 for x in L}
Omów typy wbudowane w Python
str – string (ciąg tekstowy), tekstowy typ danych,
int – liczba,
float – liczba zmiennoprzecinkowa,
complex – liczba zespolona,
list – lista
tuple – kortka
range – zakres, liczby naturalne stanowiące szereg arytmetyczny,
dict – słownik,
set – zbiór,
frozenset – zbiór niemutowalny,
bool – logika boolowska,
bytes – konwersja ciągu na bajty,
bytearray – mutowalny wariant bytes,
memoryview – dostęp do wewnętrznych danych obiektów obsługujących bufory protokołów.
Jakie znasz biblioteki standardowe w Python
random – biblioteka służąca do pseudolosowego generowania liczb,
datatime – moduł pozwalający na pracę z datą i godziną,
json – zapisuje listy, logikę, liczby, krotki i słowniki do pliku JSON,
pickle - pozwala na serializację (zmiana obiektu na ciąg bajtów) i deserializację obiektów Pythona
os – moduł pozwalający na integrację z systemem plików OS-a,
logging – biblioteka z API pozwalającym na zapisywanie logów.
__init__
__init__ jako plik pozwala na oznaczenie, że dany folder jest pakietem
W OOP to specjalna metoda wywoływana za każdym razem kiedy tworzona jest instancja klasy
Kopiowanie obiektów w Pythonie?
Służy do tego moduł copy, który oferuje dwie metody
copy()
deepcopy()
Za pomocą copy() tworzy się bitową kopię 1:1.
Zaś deepcopy() pozwala na re kursywne kopiowanie wszystkich wartości.
Czy operator = kopiuje?
nie, operator przypisania jedynie tworzy odniesienie do miejsca w pamięci, czyli za pomocą = tworzymy powiązanie pomiędzy istniejącym już obiektem a docelową nazwą zmiennej.
Zasięg (scope)
Scope to blok kodu, w którym działa dany obiekt i tylko w nim jest dostępny.
Wyróżniamy zasięg globalny i lokalny.
Przestrzenie nazw
mówią o tym jaki zasięg ma nazwa (identyfikator) danego obiektu.
Nazwy mogą działać lokalnie - w obrębie funkcji, albo globalnie w całym kodzie
Moduł a pakiet
Zarówno moduły jak i pakiety wykorzystywane są do modularyzacji kodu
Moduł to po prostu plik pythona zawierający metody, klasy zorganizowanego wokół jakiegoś tematu.
Pakiet to coś większego, gdyż składa się z kilku modułów.
Paczka określa dla nich przestrzenie (zasięg) nazw zmiennych i eliminuje konflikty pomiędzy poszczególnymi modułami.
Lista a tablica
Tablice są homogeniczne, co oznacza że zawierają dane jednego typu.
Listy są heterogeniczne, można wewnątrz nich zawszeć różne typy danych (int, float, str, bool, inne listy, słowniki itp)
PYTHONPATH
PYTHONPATH to zmienna środowiskowa pozwalająca wskazać dodatkowe lokalizacje, z których Python będzie mógł zaciągnąć moduły i paczki.
PEP8
oficjalny dokument zawierający konwencję zapisu kodu tak aby był on bardziej czytelny.
Twórca Pythona (Guido van Rossum) zaznacza, że kod jest znacznie częściej czytany niż pisany i właśnie dlatego tak ważne jest dbanie o jego czytelność i jednolitość.
Kilka ważniejszych zasad PEP8:
- 4 spacje na każdy poziom wcięcia
- do wcięć powinno się stosować spacje, a nie tabulatory
- maksymalna długość linii to 79 znaków (docstringi i komentarze – 72)
Linie mogą być zawijane (kontynuowane) poprzez dodanie lewego ukośnika “\” na końcu linii. - definicje klas i funkcji na najwyższym poziomie oddzielamy dwoma pustymi liniami.
-metody w klasie powinny być oddzielane jedną linią
- importy umieszczane są zawsze na początku pliku, po komentarzach i docstringach, a przed globalnymi i stałymi.
Powinny być pogrupowane według kolejności:
1. importy bibliotek standardowych
2. zewnętrzne importy spoza aplikacji
3. importy z lokalnej aplikacji/biblioteki
- PEP8 nie rekomenduje pojedynczego ani podwójnego cudzysłowu. Obie wersje są poprawne. Nie należy mieszać tych wersji. Wybrać jedną i trzymać się jej konsekwentnie.
- nazwy klas CamelCase
- nazwy zmiennych snake_case
- gorsze są błędne komentarze niż ich brak.
Zarządzanie pamięcią
W Pythonie za zarzadzanie pamięcią odpowiada tzw. garbage collector
Garbage collector – potocznie nazywany “odśmiecaczem”. Jest tak naprawdę automatycznym procesem odpowiedzialnym za identyfikowanie nieużywanych obiektów, a następnie za ich usunięcie. Nieużywane obiekty to takie, do których nie ma żadnych referencji, czyli nie mamy możliwości dostania się do tego obiektu
type()
Funkcja type zwraca typ danych podanego obiektu.
Funkcja ta może się okazać przydatna podczas tworzenia funkcji obsługujących kilka typów danych.
Czy parametry do funkcji są w Pythonie przekazywanie przez wartość, czy referencję?
typy niemutowalne (niezmienne) - przez wartość
typy mutowalne (zmienne) - przez referencje
W dokumentacji Pythona możemy przeczytać, że przekazywanie
argumentów odbywa się zawsze przez wartość, przy czym ta wartość jest zawsze referencją do obiektu, a
nie wartością tego obiektu.
W praktyce oznacza to, że w przypadku niezmiennych typów danych funkcje w
Pythonie działają tak, jakby ich argumenty przekazywane były przez wartość, natomiast w przypadku typów
zmiennych na ogół jak przez referencję.
zmienna
Zmienna to miejsce w pamięci, które wskazuje na jakąś wartość.
Zmiennych używamy, żeby nie operować na konkretnych wartościach.
Pojęcie zmiennej tłumaczymy jako pudełko oznaczone symbolem X, w którym schowane są potrzebne nam dane
Typy zmiennych w Pythonie
- Liczby – integer (typ całkowity) albo float (typ zmiennoprzecinkowy)
- Stringi - pojedyncza litera lub ciąg znaków
Kolekcje
3. Listy
4. Tuple (krotki)
5. Słowniki
- Wartości Booleanowskie (True or False)
… w niektórych opracowaniach spotkałam się również z funkcją jako typem
Wymień typy mutowalne i niemutowalne
Referencja (adres miejsca w pamięci) wskazuje na konkretną wartość.
Jeśli nadpiszemy typ mutowalny to referencja pozostanie ta sama, ale zmieni się wartość.
Jeśli nadpiszemy typ niemutowalny to stworzy się nowa referencja wskazująca na nową (zmienioną) wartość.
TYPY MUTOWALNE
list
dict
bytearray
+ obiekty użytkownika
TYPY NIEMUTOWALNE
string
tuple
int, float, complex
bool
range
frozenset
bytes
język skryptowy
Python określany jest jako język skryptowy
Język skryptowy jest językiem programowania, który umożliwia uruchamianie w specjalnym środowisku programów (skryptów). Z reguły te programy są interpretowane a nie kompilowane. Przeznaczeniem tych języków jest automatyzacja powtarzalnych zadań, są również stosowane jako języki osadzone w większych aplikacjach.
interpretowalny
Z punktu widzenia programisty Python jest uważany za język interpretowalny.
Wiele współczesnych języków wykorzystuje oba procesy, gdzie najpierw treść programu jest kompilowana do kodu bajtowego, a następnie interpretowana przez program zwany maszyną wirtualną. Python bazuje na obu technikach, ale z punktu widzenia programisty jest uważany za język interpretowalny.
Język interpretowany – język programowania, w którym interpreter analizuje program linia po linii. Przeciwieństwem języków interpretowanych są języki implementowane w postaci kompilatora (kompilator najpierw kompiluje cały program, a następnie zaczyna działać). Języki interpretowane są nieco wolniejsze od języków kompilowanych, lecz prostsze do napisania (mniej rzeczy o które trzeba się martwić podczas pisaniaskodu)
dynamicznie typowany
Python sam automatycznie rozpoznaje typ zmiennych na podstawie kodu.
Jest językiem silnie typowanym, czyli nie trzeba w ogóle deklarować typów zmiennych.
Istnieje jednak biblioteka Pythona, która to umożliwia
duck typing
Duck typing – rozpoznawanie typu obiektu nie na podstawie deklaracji, ale przez badanie metod udostępnionych przez obiekt.
Duck typing zazwyczaj wykorzystuje się w dynamicznych językach programowania takich jak Python, Ruby, Groovy czy JavaScript.
Technika ta wywodzi się z powiedzenia: „jeśli chodzi jak kaczka i kwacze jak kaczka, to musi być kaczką”
__init__
initializer (inicjator)
metoda wywoływana za każdym razem kiedy tworzona jest instancja klasy
Służy do ustawienia atrybutów nowo utworzonej instancji
Metoda __init__ nie tworzy nowej instancji, lecz otrzymuje ją gotową (jako pierwszy argument). Prawdziwym konstruktorem jest metoda __new__ – ona tworzy instancję.
__new__
tworzy nową instancję klasy, jest prawdziwym konstruktorem.
jest wywoływana jako pierwsza (przed __init__) i zwraca nową instancję klasy
Zwykle nie jest definiowana jawnie
__str__
Celem __str__ jest wypisanie informacji o obiekcie w takiej formie, aby była czytelna dla człowieka.
Aby rozbudować ilość informacji wyświetlanych o obiekcie, musimy dodać specjalną metodę o nazwie __str__
Domyślnie wyświetla ona pełną nazwę obiektu (wraz z umiejscowieniem) i jego adres pamięci (to nas nie powinno interesować). Możemy jednak zamienić ją tak, by zwracała bardziej przydatne informacje o obiekcie. Aby to zrobić, powinniśmy zdefiniować metodę __str__ i zwrócić z niej wartość string, która ma reprezentować obiekt.
__repr__
Celem __repr__ jest podanie precyzyjnej, ale niekoniecznie czytelnej dla człowieka informacji o obiekcie.
repr jest wbudowaną funkcją Pythona, która zwraca reprezentację danego obiektu w postaci łańcucha znaków. Działa dla dowolnych obiektów, nie tylko obiektów klas.
__add__
metoda specjalna.implementację operatora dodawania dla obiektów zapisanych za pomocą klas
W Pythonie przeciążanie operatorów robi się za pomocą metod specjalnych.
__radd__
reverse addition
Metoda Pythona __radd__() implementuje operację odwrotnego dodawania, czyli dodawania zamienionymi miejscami obiektami.
Jest wywoływana przez Python, gdy __add__ z jakiegoś powodu nie zadziała
konstruktor klasy
konstruktor – specjalna metoda danej klasy, wywoływana podczas tworzenia jej instancji.
Podstawowym zadaniem konstruktora jest zainicjowanie obiektu. W Pythonie jest to metoda __init__
__nazwametody__
tak oznacza się metody specjalne (magiczne)
przeciążanie operatorów
W Pythonie przeciążanie operatorów robi się za pomocą metod specjalnych.
Chodzi o to, aby operacje które są możliwe do wykonania na obiektach wbudowanych (takie jak dodawanie, odejmowanie, dzielenie, modulo itd) były możliwe do wykonania na obiektach zapisanych za pomocą klas (zdefiniowanych przez użytkownika).
Klasy mogą nadpisywać większość operacji wbudowanych. Nie istnieją wartości domyślne dla metod przeciążania operatorów (i nie są one potrzebne).
metoda a funkcja
metoda to funkcja powiązana z klasa
Czy Python może być używany do po stronie klienta WWW i serwera WWW?
Tak, lecz najlepiej nadaje się do backendu, czyki tworzenia aplikacji po stronie serwera WWW.
class zmienne:
def __init__(self):
self.publiczna = 10
self._chroniona = 20
self.__prywatna = 30
W Pythonie pola i metody klasy dzielą się na trzy grupy:
1. publiczne (public)
domyślnie wszystkie zmienne i metody \ są publiczne
2. prywatne (private) dla klas
dowolny użytkownik nie może ich zmodyfikować, chyba że autor klasy da taką możliwość
Zmienne i metody prywatne rozpoczynają się od podwójnego podkreślnika __zmienna.
- chronione (protected)
“by convention” te metody i zmienne nie powinny być modyfikowane przez użytkownika, ale mogą być modyfikowane przez obiekty będące instancjami tzw. klas pochodnych. Ich nazwy rozpoczynają się od pojedynczego podkreślnika: _zmienna.