Introducere

căutați un job Python? Sansele sunt va trebui să dovedească faptul că știi cum să lucreze cu Python. Iată câteva întrebări care acoperă o bază largă de abilități asociate cu Python. Accentul este pus pe limba în sine, și nu pe un anumit pachet sau cadru. Fiecare întrebare va fi legată de un tutorial adecvat dacă există unul. Unele întrebări vor încheia mai multe subiecte.,

de fapt nu am fost dat un test de interviu destul de greu ca acesta, dacă puteți ajunge la răspunsuri confortabil, atunci du-te obține-ți un loc de muncă.

ce nu este acest Tutorial

acest tutorial nu are scopul de a acoperi fiecare cultură disponibilă la locul de muncă – diferiți angajatori vă vor pune întrebări diferite în moduri diferite; ei vor urma convenții diferite; ei vor aprecia lucruri diferite. Te vor testa în moduri diferite., Unii angajatori vă vor așeza de pe un computer și vă vor cere să rezolvați probleme simple; unii vă vor sta în fața unei plăci albe și vor face similare; unii vă vor da un test de acasă pentru a rezolva; unii vor avea doar o conversație cu dvs.cel mai bun test pentru un programator este de fapt programarea. Acesta este un lucru dificil de testat cu un tutorial simplu. Deci, pentru punctele bonus, asigurați-vă că puteți utiliza efectiv funcționalitatea demonstrată în întrebări., Dacă înțelegeți de fapt cum să ajungeți la răspunsuri suficient de bine încât să puteți folosi de fapt conceptele demonstrate, atunci câștigați.în mod similar, cel mai bun test pentru un inginer de software este de fapt inginerie. Acest tutorial este despre Python ca limbă. A fi capabil să proiecteze ierarhii de clasă eficiente, eficiente și întreținute pentru rezolvarea problemelor de nișă este mare și minunat și un set de abilități care merită urmărit, dar dincolo de domeniul de aplicare al acestui text.un alt lucru pe care acest tutorial nu este este compatibil PEP8., Acest lucru este intenționat, deoarece, așa cum am menționat anterior, diferiți angajatori vor urma convenții diferite. Va trebui să vă adaptați pentru a se potrivi culturii locului de muncă. Deoarece practicabilitatea bate puritatea.un alt lucru pe care acest tutorial nu este este concis. Nu vreau să arunc doar întrebări și răspunsuri la tine și să sper că ceva se lipește. Vreau să o obțineți sau cel puțin să o obțineți suficient de bine încât să vă aflați în poziția de a căuta explicații suplimentare pentru orice subiecte problematice.

vrei să As interviul tehnic? Programați Acum o sesiune de practică de interviu tehnic cu un expert!,

Întrebarea 1

Ce este Python cu adevărat? Puteți (și sunteți încurajați) să faceți comparații cu alte tehnologii în răspunsul dumneavoastră

răspuns

iată câteva puncte cheie:

  • Python este un limbaj interpretat. Asta înseamnă că, spre deosebire de limbi precum C și variantele sale, Python nu trebuie să fie compilat înainte de a fi rulat. Alte limbi interpretate includ PHP și Ruby.

  • Python este tastat dinamic, ceea ce înseamnă că nu trebuie să precizați tipurile de variabile atunci când le declarați sau ceva de genul acesta., Puteți face lucruri cum ar fi x=111 și x="I'm a string" fără eroare

  • Python este bine adaptate pentru a orientat obiect de programare în care se permite definirea de clase, împreună cu compoziție și moștenire. Python nu au acces specificatori (cum ar fi C++modelului public, private), justificarea pentru acest punct este dat ca „suntem cu toții adulți”

  • În Python, funcțiile sunt prima clasă de obiecte., Aceasta înseamnă că pot fi atribuite variabilelor, returnate de la alte funcții și transferate în funcții. Clasele sunt, de asemenea, obiecte de primă clasă

  • scrierea codului Python este rapidă, dar rularea acestuia este adesea mai lentă decât limbile compilate. Din fericire, Python permite includerea extensiilor bazate pe C, astfel încât blocajele pot fi optimizate și adesea sunt., numpy pachet este un bun exemplu în acest sens, este într-adevăr destul de repede pentru că o mulțime de numărul de ronțăit-o, nu e de fapt facut de Python

  • Python găsește utilizarea în multe domenii – aplicații web, de automatizare, științifică, modelarea, aplicații de date de mare și multe altele. De asemenea, este adesea folosit ca cod „lipici” pentru a obține alte limbi și componente pentru a juca frumos.Python face lucrurile dificile ușor, astfel încât programatorii se pot concentra pe algoritmi și structuri imperative, mai degrabă decât pe detalii de nivel scăzut.,

de ce contează acest lucru:

dacă aplicați pentru o poziție Python, ar trebui să știți ce este și de ce este atât de grozav. Și de ce nu este o.O

Întrebarea 2

Completa codul:

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

Răspunsul

se Acorde o Atenție Specială

  • Fie în concordanță cu convențiile de denumire. Dacă există o convenție de denumire evidentă în orice cod de probă, respectați-o. Chiar dacă nu este Convenția de denumire utilizați de obicei
  • funcții Recursive trebuie să recursive și termina., Asigurați-vă că ați înțeles cum acest lucru se întâmplă astfel încât să se evite fund callstacks
  • Vom folosi os module pentru a interacționa cu sistemul de operare într-un mod care este cross-platform. Ai putea spune sChildPath = sPath + '/' + sChild dar asta nu ar funcționa pe windows
  • familiaritatea cu pachetele de bază merită cu adevărat, dar nu vă rupeți capul încercând să memorați totul, Google este prietenul dvs. la locul de muncă!
  • puneți întrebări dacă nu înțelegeți ce ar trebui să facă codul
  • sărut! Păstrați-l simplu, prost!,

de Ce Acest lucru Contează:

  • Afișează cunoștințe de bază de operare a sistemului de interacțiune lucruri
  • Recursivitate este foarte util

Întrebarea 3

Uitandu-ne la codul de mai jos, notați valorile finale de A0, A1, …An.

Dacă nu știi ce zip este nu te mai stresa. Niciun angajator sănătos nu se va aștepta să memorați biblioteca standard. Aici este ieșirea help(zip).

dacă acest lucru nu are sens, luați câteva minute pentru a vă da seama cum alegeți.,

răspuns

de ce acest lucru contează

  1. înțelegerea listei este un economizor de timp minunat și o piatră de poticnire mare pentru o mulțime de oameni
  2. dacă le puteți citi, probabil le puteți scrie
  3. o parte din acest cod a fost făcut pentru a fi în mod deliberat ciudat. Poate fi necesar să lucrați cu niște oameni ciudați

întrebarea 4

Python și multi-threading. Este o idee bună? Enumerați câteva modalități de a obține un cod Python pentru a rula într-un mod paralel.Python nu permite multi-threading în adevăratul sens al cuvântului., Are un pachet multi-threading, dar dacă doriți să multi-thread pentru a accelera codul dvs., atunci de obicei nu este o idee bună să-l utilizați. Python are un construct numit Global interpret Lock (GIL). GIL se asigură că numai unul dintre „firele” dvs. poate executa la un moment dat. Un fir dobândește GILUL, face o mică lucrare, apoi trece GILUL pe firul următor. Acest lucru se întâmplă foarte repede, astfel încât pentru ochiul uman poate părea că firele dvs. se execută în paralel, dar ele sunt într-adevăr doar pe rând folosind același nucleu CPU. Toate acestea gil trece adaugă aeriene la execuție., Aceasta înseamnă că, dacă doriți să faceți Codul să ruleze mai repede, atunci utilizarea pachetului de filetare Nu este adesea o idee bună.

există motive pentru a utiliza pachetul de filetare Python. Dacă doriți să rulați unele lucruri simultan, iar eficiența nu este o preocupare, atunci este complet bine și convenabil. Sau dacă executați un cod care trebuie să aștepte ceva (cum ar fi un IO), atunci ar putea avea mult sens. Dar biblioteca de filetare nu vă va permite să utilizați nuclee CPU suplimentare.,

Multi-threading pot fi externalizate către sistemul de operare (de a face multi-processing), unele aplicații externe care solicită codul Python (de exemplu, Scânteie sau Hadoop), sau un cod care Python codul de apeluri (de exemplu: ai putea să-ți cod Python sun o C funcția care face scumpe multi-threaded chestii).

de ce acest lucru contează

deoarece GIL este o gaură A. O mulțime de oameni petrec mult timp încercând să găsească blocaje în codul lor fantezist Python multi-threaded înainte de a afla ce este GIL.,

întrebare 5

cum urmăriți diferitele versiuni ale codului dvs.?

răspuns:

controlul versiunii! În acest moment, ar trebui să acționați entuziasmat și să le spuneți cum utilizați chiar și Git (sau orice este preferatul dvs.) pentru a urmări corespondența cu bunica. Git este sistemul meu preferat de control al versiunii, dar există și altele, de exemplu subversion.

de ce contează acest lucru:

deoarece codul fără control al versiunii este ca cafeaua fără ceașcă., Uneori avem nevoie pentru a scrie o dată-off arunca script-uri și asta e ok, dar dacă aveți de-a face cu orice cantitate semnificativă de cod, un sistem de control versiune va fi un beneficiu. Controlul versiunii ajută la urmărirea cine a făcut ce schimbare la baza codului; aflarea când au fost introduse bug-uri la cod; urmărirea versiunilor și a versiunilor software-ului dvs.; distribuirea codului sursă între membrii echipei; implementarea și anumite automatizări. Acesta vă permite să se rostogolească codul înapoi înainte de a-l rupt, care este mare pe cont propriu. Multe lucruri. E minunat.,

Întrebarea 6

Ce face acest cod de ieșire:

def f(x,l=): for i in range(x): l.append(i*i) print(l) f(2)f(3,)f(3)

Răspunsul

Hu?

primul apel de funcție ar trebui să fie destul de evident, bucla adaugă 0 și apoi 1 la lista goală, l. l este un nume pentru o variabilă care indică o listă stocată în memorie.
al doilea apel începe prin crearea unei noi liste într-un nou bloc de memorie. l apoi se referă la această nouă listă. Apoi adaugă 0, 1 și 4 la această nouă listă. Deci asta e grozav.,
al treilea apel funcție este cel ciudat. Utilizează lista originală stocată în blocul de memorie original. De aceea începe cu 0 și 1.

încercați acest lucru dacă nu înțelegeți:

întrebarea 7

Ce este patching-ul maimuței și este vreodată o idee bună?

răspuns

Monkey patching schimbă comportamentul unei funcții sau obiect după ce a fost deja definit. De exemplu:

import datetimedatetime.datetime.now = lambda: datetime.datetime(2012, 12, 12)

de cele mai multe ori este o idee destul de teribilă – de obicei este mai bine dacă lucrurile acționează într-un mod bine definit. Un motiv pentru a monkey patch ar fi în testare., Pachetul mock este foarte util în acest scop.

de ce acest lucru contează

Acesta arată că ați înțeles un pic despre metodologii în unitatea de testare. Menționarea dvs. de evitare a maimuțelor va arăta că nu sunteți unul dintre acei codificatori care favorizează codul fantezist față de codul care poate fi întreținut (sunt acolo și suge să lucreze cu). Amintiți-vă principiul sărutului? Și arată că știți câte ceva despre cum funcționează Python la un nivel inferior, cum funcțiile sunt de fapt stocate și apelate și așa mai departe.PS: merită să citiți puțin despre batjocură dacă nu ați făcut-o încă. Este destul de util.,

întrebare 8

ce înseamnă aceste lucruri: *args, **kwargs? Și de ce l-am folosi?

Answer

utilizați *args când nu suntem siguri câte argumente vor fi transmise unei funcții sau dacă dorim să transmitem o listă stocată sau un tuplu de argumente unei funcții. **kwargs este folosit atunci când nu știm câte argumente de cuvinte cheie vor fi transmise unei funcții sau poate fi folosit pentru a transmite valorile unui dicționar ca argumente de cuvinte cheie., Identificatorii args și kwargs sunt o convenție, ai putea folosi, de asemenea, *bob și **billy dar că nu ar fi înțelept.

Iată o mică ilustrație:

de ce să-ți pese?

uneori va trebui să trecem un număr necunoscut de argumente sau argumente de cuvinte cheie într-o funcție. Uneori vom dori să stocăm argumente sau argumente de cuvinte cheie pentru o utilizare ulterioară. Uneori este doar un economizor de timp.,

Întrebarea 9

Ce înseamnă acestea pentru tine: @classmethod, @staticmethod, @property?

răspundeți cunoștințelor de fond

acestea sunt decoratori. Un decorator este un tip special de funcție care fie ia o funcție și returnează o funcție, sau ia o clasă și returnează o clasă. Simbolul @ este doar zahăr sintactic care vă permite să decorați ceva într-un mod ușor de citit.,

@my_decoratordef my_func(stuff): do_things

Este echivalent cu

def my_func(stuff): do_thingsmy_func = my_decorator(my_func)

puteți găsi un tutorial despre cum decoratori, în general, lucrează aici.

Răspuns Real

decoratori @classmethod, @staticmethod și @property sunt utilizate pe funcții definite în interiorul claselor. Iată cum se comportă:

întrebarea 10

luați în considerare următorul cod, ce va ieși?

răspuns

ieșirea este specificată în comentariile din segmentul de mai jos:

de ce ne pasă?,

deoarece programarea OO este foarte, foarte importantă. Serios. Răspunsul la această întrebare arată înțelegerea moștenirii și utilizarea funcției Python super. De cele mai multe ori ordinea rezoluției nu contează. Uneori se întâmplă, depinde de aplicația dvs.

întrebarea 11

luați în considerare următorul cod, ce va ieși?de ce ne intereseaza acest lucru? – de ce ne intereseaza? – de ce ne intereseaza? – de ce ne intereseaza? – de ce ne intereseaza?

deoarece compoziția și construcția de obiecte este ceea ce obiectele sunt toate despre., Obiectele sunt compuse din lucruri și trebuie inițializate cumva. Acest lucru leagă, de asemenea, unele lucruri despre recursivitate și utilizarea generatoarelor.generatoarele sunt minunate. Ați fi putut obține o funcționalitate similară cu print_all_2 construind doar o listă lungă și apoi imprimând conținutul acesteia. Unul dintre lucrurile frumoase despre generatoare este că nu trebuie să ocupe mult spațiu în memorie.de asemenea, merită subliniat faptul că print_all_1traversează arborele într-o manieră de adâncime, în timp ce print_all_2 este lățimea-prima., Asigurați-vă că înțelegeți acești Termeni. Uneori, un fel de traversare este mai potrivit decât celălalt. Dar asta depinde foarte mult de cererea dvs.

întrebarea 12

descrieți pe scurt mecanismul de colectare a gunoiului Python.

răspuns

multe pot fi spuse aici. Există câteva puncte principale pe care ar trebui să le menționați:

  • Python menține un număr de referințe la fiecare obiect din memorie., Dacă un număr de referință merge la zero, atunci obiectul asociat nu mai este live și memoria alocată acelui obiect poate fi eliberată pentru altceva
  • ocazional se întâmplă lucruri numite „cicluri de referință”. Colectorul de gunoi caută periodic aceste și le curăță. Un exemplu ar fi dacă ai două obiecte o1 și o2 astfel încât o1.x == o2 și o2.x == o1. Dacă o1 și o2 nu sunt referite de nimic altceva, atunci nu ar trebui să fie live., Dar fiecare dintre ele are un număr de referință de 1.anumite euristici sunt folosite pentru a accelera colectarea gunoiului. De exemplu, obiectele create recent sunt mai susceptibile de a fi moarte. Pe măsură ce obiectele sunt create, colectorul de gunoi le atribuie generațiilor. Fiecare obiect primește o generație, iar generațiile mai tinere sunt tratate mai întâi.această explicație este specifică CPython.

    întrebarea 13

    plasați următoarele funcții mai jos în ordinea eficienței lor. Toate acestea iau într-o listă de numere între 0 și 1. Lista poate fi destul de lungă., Un exemplu de listă de intrare ar fi . Cum ați dovedi că răspunsul dvs. este corect?

    Răspunsul

    cel Mai mult la cel mai puțin eficient: f2, f1, f3. Pentru a dovedi că acesta este cazul, ați dori să vă profilați codul. Python are un pachet minunat de profilare care ar trebui să facă trucul.

    import cProfilelIn = cProfile.run('f1(lIn)')cProfile.run('f2(lIn)')cProfile.run('f3(lIn)')

    de dragul finalizării, iată care sunt ieșirile profilului de mai sus:

    de ce să-ți pese?

    localizarea și evitarea blocajelor este adesea destul de utilă., O mulțime de codificare pentru eficiență se reduce la bunul simț – în exemplul de mai sus este evident mai rapid să sortați o listă dacă este o listă mai mică, deci dacă aveți posibilitatea de a alege filtrarea înainte de un fel, este adesea o idee bună. Lucrurile mai puțin evidente pot fi încă localizate prin utilizarea instrumentelor adecvate. Este bine să știți despre aceste instrumente.

    întrebare 14

    ceva ce nu a reușit la?

    răspuns greșit

    nu reușesc niciodată!

    de ce este Important acest lucru:

    arată că sunteți capabil să recunoașteți erori, să vă asumați responsabilitatea pentru greșelile dvs. și să învățați din greșelile dvs., Toate aceste lucruri sunt destul de darn importante dacă aveți de gând să fie util. Dacă sunteți de fapt perfect, atunci prea rău, ar putea fi necesar să fiți creativi aici.

    întrebare 15

    aveți proiecte personale?

    într-adevăr?

    Acest lucru arată că sunteți dispus să faceți mai mult decât minimul necesar în ceea ce privește menținerea abilităților dvs. actualizate. Dacă lucrați la proiecte personale și cod în afara locului de muncă, atunci angajatorii sunt mai susceptibili să vă vadă ca pe un activ care va crește. Chiar dacă nu pun această întrebare, mi se pare util să abordez subiectul.,

    concluzie

    aceste întrebări au atins în mod intenționat multe subiecte. Iar răspunsurile au fost în mod intenționat verbose. Într-un interviu de programare, va trebui să demonstreze înțelegerea dumneavoastră și dacă se poate face într-un mod concis apoi prin toate mijloacele face asta. Am încercat să dau suficiente informații în răspunsurile pe care le-ar putea culege un sens de la ei, chiar dacă nu ați auzit de unele dintre aceste subiecte înainte. Sper că veți găsi acest lucru util în căutarea de locuri de muncă.

    du-te-le tigru.

Articles

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *