wprowadzenie
szukasz pracy w Pythonie? Są szanse, że będziesz musiał udowodnić, że wiesz, jak pracować z Pythonem. Oto kilka pytań, które obejmują szeroką bazę umiejętności związanych z Pythonem. Skupiamy się na samym języku, a nie na żadnym konkretnym pakiecie czy frameworku. Każde pytanie będzie powiązane z odpowiednim samouczkiem, jeśli takie istnieje. Niektóre pytania zakończą wiele tematów.,
nie dostałam jeszcze tak twardego testu na rozmowę kwalifikacyjną, jak ten, jeśli możesz wygodnie dotrzeć do odpowiedzi, to znajdź sobie pracę.
czym nie jest ten samouczek
Ten samouczek nie ma na celu omówienia każdej dostępnej kultury miejsca pracy – różni pracodawcy zadają ci różne pytania na różne sposoby; będą przestrzegać różnych konwencji; będą cenić różne rzeczy. Będą Cię testować na różne sposoby., Niektórzy pracodawcy posadzą cię z komputera i poproszą o rozwiązanie prostych problemów; niektórzy staną Cię przed białą tablicą i zrobią podobne; niektórzy dadzą Ci test do domu, aby rozwiązać; niektórzy po prostu porozmawiają z Tobą.
najlepszym testem dla programisty jest programowanie. Jest to trudna rzecz do przetestowania za pomocą prostego samouczka. Tak więc w przypadku punktów bonusowych upewnij się, że możesz rzeczywiście korzystać z funkcjonalności pokazanej w pytaniach., Jeśli rzeczywiście zrozumieć, jak dostać się do odpowiedzi na tyle dobrze, że można rzeczywiście korzystać z zademonstrowanych pojęć, to wygrywasz.
podobnie, najlepszym testem dla inżyniera oprogramowania jest inżynieria. Ten samouczek dotyczy Pythona jako języka. Umiejętność projektowania wydajnych, skutecznych, utrzymywalnych hierarchii klasowych do rozwiązywania problemów niszowych jest wspaniała i wspaniała oraz zestaw umiejętności wartych realizacji, ale znacznie wykraczających poza zakres tego tekstu.
inna sprawa, że ten tutorial nie jest zgodny z PEP8., Jest to celowe, ponieważ, jak wspomniano wcześniej, różni pracodawcy będą przestrzegać różnych konwencji. Będziesz musiał dostosować się do kultury miejsca pracy. Ponieważ praktyczność bije czystość.
inna rzecz, że ten tutorial nie jest zwięzły. Nie chcę po prostu rzucać w ciebie pytaniami i odpowiedziami i mieć nadzieję, że coś się ukaże. Chcę, abyś to zrozumiał, a przynajmniej na tyle dobrze, że jesteś w stanie samodzielnie szukać dalszych wyjaśnień dla wszelkich problemów.
chcesz przeprowadzić wywiad techniczny? Zaplanuj sesję praktycznej rozmowy technicznej z ekspertem już teraz!,
Pytanie 1
czym tak naprawdę jest Python? Możesz (i jesteś zachęcany) porównywać inne technologie w swojej odpowiedzi
odpowiedź
oto kilka kluczowych punktów:
-
Python jest językiem interpretowanym. Oznacza to, że w przeciwieństwie do języków takich jak C i jego warianty, Python nie musi być kompilowany przed jego uruchomieniem. Inne interpretowane języki to PHP i Ruby.
-
Python jest wpisywany dynamicznie, co oznacza, że nie musisz podawać typów zmiennych, gdy je deklarujesz lub coś podobnego., Możesz robić takie rzeczy, jak
x=111
, a następniex="I'm a string"
bez błędu -
Python dobrze nadaje się do programowania obiektowego, ponieważ umożliwia definiowanie klas wraz ze składem i dziedziczeniem. Python nie ma specyfików dostępu (takich jak
public
,private
), uzasadnienie dla tego punktu jest podane jako „We are all adults here” -
w Pythonie funkcje są obiektami pierwszej klasy., Oznacza to, że mogą być przypisane do zmiennych, zwracane z innych funkcji i przekazywane do funkcji. Klasy są również obiektami pierwszej klasy
-
pisanie kodu Pythona jest szybkie, ale jego uruchamianie jest często wolniejsze niż skompilowane języki. Na szczęście Python pozwala na włączenie rozszerzeń opartych na C, więc wąskie gardła można zoptymalizować i często są., Pakiet
numpy
jest tego dobrym przykładem, jest naprawdę dość szybki, ponieważ wiele z tych danych nie jest w rzeczywistości wykonywane przez Python -
Python znajduje zastosowanie w wielu dziedzinach – aplikacje internetowe, automatyzacja, modelowanie naukowe, aplikacje big data i wiele innych. Jest również często używany jako” klej ” kod, aby uzyskać inne języki i komponenty, aby grać ładnie.
-
Python sprawia, że trudne rzeczy są łatwe, więc programiści mogą skupić się na nadpisywaniu algorytmów i struktur, a nie na szczegółach niskiego poziomu.,
dlaczego to ma znaczenie:
jeśli ubiegasz się o stanowisko Pythona, powinieneś wiedzieć, co to jest i dlaczego jest tak cholernie fajne. I dlaczego nie jest o. o
Pytanie 2
wypełnij brakujący Kod:
def print_directory_contents(sPath): """ This function takes the name of a directory and prints out the paths files within that directory as well as any files contained in contained directories. This function is similar to os.walk. Please don't use os.walk in your answer. We are interested in your ability to work with nested structures. """ fill_this_in
Odpowiedz
zwróć szczególną uwagę
- bądź zgodny ze swoimi konwencjami nazewnictwa. Jeśli istnieje konwencja nazewnictwa widoczna w dowolnym przykładowym kodzie, trzymaj się jej. Nawet jeśli nie jest to konwencja nazewnictwa zwykle używasz
- funkcje rekurencyjne muszą rekurencyjnie i zakończyć., Upewnij się, że rozumiesz, jak to się dzieje, aby uniknąć bezdennych połączeń
- używamy modułu
os
do interakcji z systemem operacyjnym w sposób wieloplatformowy. Można powiedziećsChildPath = sPath + '/' + sChild
ale to nie działa na windows - znajomość pakietów bazowych jest naprawdę warta zachodu, ale nie łam głowy próbując zapamiętać wszystko, Google jest twoim przyjacielem w miejscu pracy!
- Zadawaj pytania, jeśli nie rozumiesz, co ma zrobić kod
- KISS! To proste, głupku!,
dlaczego to ma znaczenie:
- wyświetla wiedzę o podstawowych interakcjach z systemem operacyjnym
- Rekurencja jest przydatna
pytanie 3
patrząc na poniższy kod, Zapisz Końcowe wartości A0, A1, …An.
Jeśli nie wiesz co zip
nie stresuj się. Żaden rozsądny pracodawca nie będzie oczekiwał, że zapamiętasz standardową bibliotekę. Oto wyjście help(zip)
.
Jeśli to nie ma sensu, poświęć kilka minut, aby dowiedzieć się, jak chcesz.,
Odpowiedz
dlaczego to ma znaczenie
- zrozumienie listy to wspaniała oszczędność czasu i duża przeszkoda dla wielu osób
- Jeśli możesz je przeczytać, prawdopodobnie możesz je zapisać
- niektóre z tego kodu zostały celowo dziwne. Być może będziesz musiał pracować z dziwnymi ludźmi
Pytanie 4
Python i wielowątkowość. Czy to dobry pomysł? Wymień kilka sposobów na uruchomienie kodu Pythona w sposób równoległy.
odpowiedź
Python nie pozwala na wielowątkowość w najprawdziwszym tego słowa znaczeniu., Ma pakiet wielowątkowy, ale jeśli chcesz wielowątkowy, aby przyspieszyć kod, zwykle nie jest to dobry pomysł, aby go używać. Python ma konstrukcję o nazwie Global Interpreter Lock (Gil). Gil upewnia się, że tylko jeden z Twoich „wątków” może wykonać w tym samym czasie. Wątek zdobywa GIL, wykonuje trochę pracy, a następnie przekazuje GIL na następny wątek. Dzieje się to bardzo szybko, więc dla ludzkiego oka może się wydawać, że twoje wątki wykonują się równolegle, ale tak naprawdę po prostu na zmianę używają tego samego rdzenia procesora. Całe to przechodzenie Gilów zwiększa koszty egzekucji., Oznacza to, że jeśli chcesz, aby Twój kod działał szybciej, używanie pakietu wątków często nie jest dobrym pomysłem.
istnieją powody, dla których warto używać pakietu threadingowego Pythona. Jeśli chcesz uruchomić kilka rzeczy jednocześnie, a wydajność nie jest problemem, to jest całkowicie w porządku i wygodne. Lub jeśli używasz kodu, który musi na coś poczekać (np. niektóre IO), to może to mieć sens. Ale biblioteka wątków nie pozwala na użycie dodatkowych rdzeni procesora.,
wielowątkowość można zlecić systemowi operacyjnemu (wykonując wielowątkowość), jakiejś zewnętrznej aplikacji, która wywołuje kod Pythona (np. Spark lub Hadoop) lub jakiś kod, który wywołuje kod Pythona (np.: możesz mieć Kod Pythona wywołujący funkcję C, która robi drogie wielowątkowe rzeczy).
dlaczego to ma znaczenie
bo GIL to dziura. Wiele osób spędza dużo czasu, próbując znaleźć wąskie gardła w ich fantazyjnym wielowątkowym kodzie Pythona, zanim dowiedzą się, czym jest GIL.,
Pytanie 5
Jak śledzić różne wersje kodu?
odpowiedź:
Kontrola wersji! W tym momencie powinieneś zachowywać się podekscytowany i mówić im, jak w ogóle używasz Gita (lub czegokolwiek, co lubisz), aby śledzić korespondencję z babcią. Git jest moim preferowanym systemem kontroli wersji, ale są też inne, na przykład subversion.
dlaczego to ma znaczenie:
ponieważ kod bez kontroli wersji jest jak kawa bez filiżanki., Czasami musimy napisać raz-off wyrzucić skrypty i to jest w porządku, ale jeśli masz do czynienia z jakąkolwiek znaczną ilością kodu, system kontroli wersji będzie korzyścią. Kontrola wersji pomaga śledzić, kto wprowadził jaką zmianę w kodzie; dowiedzieć się, kiedy błędy zostały wprowadzone do kodu; śledzenie wersji i wydań oprogramowania; dystrybucję kodu źródłowego wśród członków zespołu; wdrażanie i pewne automatyzacje. Pozwala to cofnąć kod, zanim go złamałeś, co jest świetne samo w sobie. Dużo rzeczy. Po prostu świetnie.,
pytanie 6
Jaki jest wynik tego kodu:
def f(x,l=): for i in range(x): l.append(i*i) print(l) f(2)f(3,)f(3)
odpowiedź
Hu?
pierwsze wywołanie funkcji powinno być dość oczywiste, pętla dodaje 0, a następnie 1 do pustej listy, l
. l
jest nazwą zmiennej, która wskazuje na listę przechowywaną w pamięci.
drugie wywołanie rozpoczyna się od utworzenia nowej listy w nowym bloku pamięci. l
Następnie dodaje 0, 1 i 4 do tej nowej listy. To świetnie.,
trzecie wywołanie funkcji jest dziwne. Używa oryginalnej listy przechowywanej w oryginalnym bloku pamięci. Dlatego zaczyna się od 0 i 1.
wypróbuj to, jeśli nie rozumiesz:
pytanie 7
czym jest łatanie małp i czy jest to dobry pomysł?
odpowiedź
Monkey patching zmienia zachowanie funkcji lub obiektu po jej zdefiniowaniu. Na przykład:
import datetimedatetime.datetime.now = lambda: datetime.datetime(2012, 12, 12)
przez większość czasu jest to dość straszny pomysł – zwykle najlepiej jest, jeśli rzeczy działają w dobrze określony sposób. Jednym z powodów, dla których monkey patch byłby testowany., Przykładowy pakiet jest bardzo przydatny w tym celu.
dlaczego to ma znaczenie
pokazuje, że rozumiesz trochę o metodologiach w testach jednostkowych. Twoja wzmianka o unikaniu małp pokaże, że nie jesteś jednym z tych programistów, którzy faworyzują wymyślny kod zamiast kodu do utrzymania (są tam i są do bani w pracy). Pamiętasz zasadę pocałunku? I pokazuje, że wiesz trochę o tym, jak Python działa na niższym poziomie, jak funkcje są faktycznie przechowywane i wywoływane i tym podobne.
PS: naprawdę warto poczytać trochę o mocku, jeśli jeszcze tego nie zrobiłeś. To bardzo przydatne.,
pytanie 8
Co to znaczy:*args
,**kwargs
? Dlaczego mielibyśmy go używać?
Odpowiedz
użyj*args
gdy nie jesteśmy pewni, ile argumentów zostanie przekazanych do funkcji, lub jeśli chcemy przekazać przechowywaną listę lub krotkę argumentów do funkcji. **kwargs
jest używany, gdy nie wiemy, ile argumentów słów kluczowych zostanie przekazanych do funkcji lub może być użyty do przekazania wartości słownika jako argumentów słów kluczowych., Identyfikatory args
I kwargs
są konwencją, można również użyć *bob
I **billy
, ale to nie byłoby mądre.
oto mała ilustracja:
dlaczego warto?
czasami będziemy musieli przekazać nieznaną liczbę argumentów lub argumentów słów kluczowych do funkcji. Czasami będziemy chcieli przechowywać argumenty lub argumenty słów kluczowych do późniejszego użycia. Czasami to tylko oszczędność czasu.,
pytanie 9
co one dla Ciebie oznaczają: @classmethod
, @staticmethod
, @property
?
Odpowiedz” Dekorator jest specjalnym rodzajem funkcji, która albo przyjmuje funkcję i zwraca funkcję, albo przyjmuje klasę i zwraca klasę. Symbol@
jest tylko cukrem składniowym, który pozwala ozdobić coś w sposób łatwy do odczytania.,
@my_decoratordef my_func(stuff): do_things
@my_decoratordef my_func(stuff): do_things
jest odpowiednikiem
def my_func(stuff): do_thingsmy_func = my_decorator(my_func)
tutorial o tym, jak dekoratorzy w ogóle pracują tutaj.
aktualna odpowiedź
dekoratory@classmethod
,@staticmethod
I@property
są używane na funkcjach zdefiniowanych w klasach. Oto jak się zachowują:
pytanie 10
zastanów się nad poniższym kodem, co wyjdzie?
odpowiedź
wyjście jest określone w komentarzach w poniższym segmencie:
dlaczego nam zależy?,
bo programowanie OO jest bardzo, bardzo ważne. Naprawdę. Odpowiedź na to pytanie pokazuje twoje zrozumienie dziedziczenia i korzystania z funkcji super
. Przez większość czasu kolejność rozdzielczości nie ma znaczenia. Czasami tak jest, zależy to od twojej aplikacji.
pytanie 11
rozważ poniższy kod, co wyjdzie?
odpowiedź
oRoot.print_all_1()
wydruki:
oRoot.print_all_2()
wydruki:
Dlaczego nas to obchodzi?
bo o skład i budowę obiektów chodzi., Obiekty składają się z rzeczy i muszą być jakoś zainicjowane. Wiąże to również pewne rzeczy na temat rekurencji i użycia generatorów.
generatory są świetne. Można było osiągnąć podobną funkcjonalność do print_all_2
po prostu konstruując dużą długą listę, a następnie drukując jej zawartość. Jedną z fajnych rzeczy na temat generatorów jest to, że nie muszą zajmować dużo miejsca w pamięci.
warto również zauważyć, żeprint_all_1
przemierza drzewo w sposób pierwszy na głębokość, podczas gdyprint_all_2
jest najpierw na szerokość., Upewnij się, że rozumiesz te warunki. Czasami jeden rodzaj trawersu jest bardziej odpowiedni niż drugi. Ale to zależy w dużej mierze od twojej aplikacji.
pytanie 12
opisz w skrócie mechanizm zbierania śmieci w Pythonie.
odpowiedź
wiele można tu powiedzieć. Jest kilka głównych punktów, o których powinieneś wspomnieć:
- Python utrzymuje liczbę odwołań do każdego obiektu w pamięci., Jeśli liczba referencji spadnie do zera, powiązany obiekt nie jest już aktywny, a pamięć przydzielona do tego obiektu może zostać zwolniona dla czegoś innego
- czasami zdarzają się rzeczy zwane „cyklami referencyjnymi”. Śmieciarz okresowo ich szuka i czyści je. Przykładem może być, jeśli masz dwa obiekty
o1
Io2
takie, żeo1.x == o2
Io2.x == o1
. Jeślio1
Io2
nie są odwołane przez nic innego, to nie powinny być aktywne., Ale każdy z nich ma liczbę referencyjną równą 1. - niektóre heurystyki są używane do przyspieszenia zbierania śmieci. Na przykład ostatnio utworzone obiekty są bardziej narażone na śmierć. W miarę tworzenia obiektów, garbage collector przypisuje je pokoleniom. Każdy obiekt otrzymuje jedno pokolenie, a młodsze pokolenia są traktowane jako pierwsze.
to wyjaśnienie jest specyficzne dla CPython.
pytanie 13
umieść poniżej następujące funkcje w kolejności ich skuteczności. Wszystkie przyjmują listę liczb od 0 do 1. Lista może być dość długa., Przykładowa lista wejściowa to . Jak udowodnisz, że Twoja odpowiedź jest prawidłowa?
odpowiedź
najbardziej Lub najmniej wydajny: f2
, f1
, f3
. Aby udowodnić, że tak jest, chcesz profilować swój kod. Python ma piękny pakiet profilowania, który powinien załatwić sprawę.
import cProfilelIn = cProfile.run('f1(lIn)')cProfile.run('f2(lIn)')cProfile.run('f3(lIn)')
ze względu na ukończenie, oto co wyrabia powyższy profil:
dlaczego warto?
lokalizowanie i unikanie wąskich gardeł jest często dość opłacalne., Dużo kodowania dla wydajności sprowadza się do zdrowego rozsądku – w powyższym przykładzie oczywiście szybciej jest posortować listę, jeśli jest to mniejsza lista, więc jeśli masz wybór filtrowania przed sortowaniem, często jest to dobry pomysł. Mniej oczywiste rzeczy mogą być nadal zlokalizowane za pomocą odpowiednich narzędzi. Dobrze wiedzieć o tych narzędziach.
pytanie 14
coś ci się nie udało?
zła odpowiedź
nigdy nie zawodzę!
dlaczego jest to ważne:
pokazuje, że jesteś w stanie przyznać się do błędów, wziąć odpowiedzialność za swoje błędy i uczyć się na swoich błędach., Wszystkie te rzeczy są cholernie ważne, jeśli masz zamiar być przydatne. Jeśli rzeczywiście jesteś idealny, to szkoda, być może będziesz musiał stać się kreatywny.
pytanie 15
masz jakieś osobiste projekty?
naprawdę?
To pokazuje, że jesteś gotów zrobić więcej niż tylko minimum, jeśli chodzi o aktualizowanie zestawu umiejętności. Jeśli pracujesz nad osobistymi projektami i kodujesz poza miejscem pracy, pracodawcy są bardziej skłonni zobaczyć cię jako aktywa, które będą rosnąć. Nawet jeśli nie zadają tego pytania, uważam, że warto poruszyć ten temat.,
wnioski
te pytania celowo poruszyły wiele tematów. A odpowiedzi były celowo gadatliwe. W wywiadzie programistycznym będziesz musiał zademonstrować swoje zrozumienie i jeśli możesz to zrobić w zwięzły sposób, zrób to za wszelką cenę. Starałem się dać wystarczająco dużo informacji w odpowiedziach, że można zebrać jakieś znaczenie z nich, nawet jeśli nigdy nie słyszał o niektórych z tych tematów Przed. Mam nadzieję, że okaże się to przydatne w szukaniu pracy.
go get ’em tiger.