Câteva întrebări pentru python-zadrota

Îmi amintesc recent că am fost întrebat de un ciudat: ce întrebări poate cere unui programator Python să-și evalueze cunoștințele? Sincer, nu-mi plac aceste teste, deoarece toate se fierbe în jos sau synthetics într-un vid sau în cunoașterea anumitor funcții de documentare și de limbi bug-uri. Ei sunt, de asemenea, adorați să dea tot felul de interviuri, unde cel mai înalt grad de idioție este interzicerea Google și scrie totul pe o bucată de hârtie. Ei bine, există "cum să faci xor în Python?". Ei bine, cel puțin rețineți subiectul amuzant pe hub despre Senior PHP și răspunsul meu amuzant. Deși a fost răsfățat, dar în opinia mea, încă mai am pentru el, 5 karmă de oameni răi nefericiți. Ei bine, este încă bine, RNR'shniki Habré - pentru toate înveninat alte castă rareori predispuse la auto-ironie, asa ca de obicei pentru srachi în PHP Topeka tăiat în jos mai mult. Dar sensul ironiei mele este clar - din cele trei întrebări despre PHP, punctul zero se referă la PHP. Și, ca oricine, în orice mod de a înțelege programator, de obicei, nu-mi pasă de numele metodelor de clasă șir de caractere, chiar și eu încă de multe ori se uita pe furiș prin bpython numele și nimic lor în viață, ai nevoie de ceva mai mult. Ceea ce pot tolera aici sunt întrebări precum "cum să listați toate câmpurile și metodele obiectului începând cu" jopa "". Orice Pythonistas răspuns ceva de descărcare de gestiune: >>> [x pentru x în dir ( ""), în cazul în care x.startswith ( "T")]






['titlu', 'traduce']

Experienta mea este insa mica, insa am reusit sa-mi gasesc cateva intrebari preferate pe care imi place sa le imping pe pionisti novici.

Să începem cu o întrebare simplă, doar pentru a determina - înainte de comutarea cu C sau dacă băiatul a văzut cel puțin o dată manualul.

Cum să sortați două liste cu elementele celui de-al doilea?

Dacă gândiți sau nu știți - poate că totul este rău sau poate că ați uitat. Dacă a început să-și scrie scrisoarea, atunci acesta este un al doilea de studenți. Răspunsul cu cel mai mare tip python este: >>> a = [1, 3, 2]
>>> b = [11, 33, 22]
>>> sortate (zip (a, b), cheie = lambda x: x [1])
[(1, 11), (2, 22), (3, 33)]

Întrebarea este doar cunoașterea sintaxei, ci cunoașterea corectă. Aici ați ales și sortate (), și lambda, și zip (). Un set de domni, fără să fie nicăieri.

upd: în al treilea Python, argumentul cheie a fost eliminat, lăsând doar cmp. Așadar este posibil și aici și așa: sortate (zip (a, b), cmp = lambda x, y: x [1] - y [1])

upd2: Eroare, în al treilea python, doar cmp a fost eliminat. Deci: sortate (iterabil, cheie = Nici unul, invers = Fals)

Scrieți un ciclu de la 1 la 100000000000000000000000

Aceasta este întrebarea mea preferată, pe care am auzit-o undeva pe Yandex, și de atunci a crescut să se îndrăgostească. Chiar și pentru prima dată nu am înțeles ce a fost greșit și a scris ca de obicei pentru mine în xrange (.). Întrebarea este doar esența "adâncă" a lui Python. Deoarece unii oameni cred că dacă ați eliminat tipurile de date, pointeri și alte hrenoten, acum puteți face orice. Dar nu. Faceți: >>> de la sys import maxint
>>> maxint
9223372036854775807 Și veți vedea că int în Python este limitată. Wow. Miracolele și mișcările nesfârșite nu se întâmplă. O gamă și xrange atunci când treci un parametru la ele, rulați-l prin int (). Deci, cu o provocare atât de frumoasă, toată lumea este futută. Aceasta este o întrebare bună. Afișează imediat dacă persoana este frică de generatoare sau nu și dacă există ceva despre tipurile de date. Pe scurt, răspunsul corect este "a scrie cel mai simplu generator". E de ajuns. Dacă tru, atunci scrie ceva de genul: >>> def gen (a):






. în timp ce o> 0:
. a - = 1
. randamentul a
.
>>> lista (gen (20))
[19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]

Ce se va întâmpla.

dacă executați codul: >>> a = [[]] * 3
>>> a [0] .append (42)
>>> print a
și cel mai important - de ce?

Dacă nu știi ce înseamnă să [[]] * 3 - cel mai probabil, întrebarea nu va răspunde (chiar și cu indiciu că aceasta creează o listă a celor trei liste) Ei bine, nu este fatală, va ști ce să învețe, dar dacă știi - Trebuie să spun un truc murdar. Creăm o listă de trei liste, prima introduce 42, se pare că totul este bine. Pe această piatră, am dat peste cap prima dată când am scris o carte de curs.

Răspunsul corect este: [42], [42], [42]

Da, da, toate listele create în interior sunt pointeri la același obiect. Acesta este un truc. Bună ziua, C / C ++.

Care este diferența dintre () și [] în expresiile din listă?

Ei bine, asta este, ce [x pentru x în primul] diferă de (x pentru x în lst). Am fost surprins, dar foarte mulți nu. Există deja da, la cunoașterea limbii. Primul - returnează imediat o listă, al doilea - generatorul de obiecte al acestei liste.

Cum de a scrie un singleton?

În opinia mea, întrebarea favorită a tuturor pioniștilor. Când am pregătit acest text și i-am întrebat pe prieteni, 100% dintre ei au sugerat includerea acestei întrebări. Dar nu nega, întrebarea este foarte bună și se referă la particularitățile limbajului însuși. Aici, din nou, mai multe opțiuni pentru un răspuns: 1) "Și Cho este un singleton?" Apoi, imediat totul este limpede, "bandă de patru" în mână și știința de graniță. 2) El va incepe sa-si scrie clasele cu get_instance () si incercand sa faca constructorul privat. Dacă vrei să te distrezi, poți chiar să-l vezi. Cu toate acestea, este mai bine să opriți imediat și să învățați ultimul punct. 3) Incepe sa scrie un singleton pe metaclasses. Acest lucru este rar și demn de respect, pentru că oricine poate supraviețui metaclaselor lui python poate face deja un tatuaj cu un șarpe. Dar, indiferent cât de rece a fost, este să prick nuci cu o explozie nucleară. 4) Modul din Python este deja singleton. Creăm modulul oriunde în el, deși în __init__.py ne declarăm toate funcționalitățile și apoi importăm modulul my_cool_single. Efectuat. Importul nou nu va schimba nimic.

Ce se va întâmpla și de ce?

Iată codul: >>> a = [1, 2, 3, 4, 5]
>>> pentru x în a:
. del x

Se pare că totul este lizibil și rece. În ciuda 1, 2, 3. - acestea sunt încă obiecte, ele pot fi șterse. Și nimic nu a prezis probleme, doar aici. Nimic nu se va întâmpla. Lista nu va fi afectată. Principalul lucru este de ce? Sincer, nu am citit docul oficial despre asta și am uitat totul, dar aș susține astfel: - Lista conține indicii pentru obiecte. Obiectele sunt stocate în altă parte în memorie. La listarea pentru lista, vom crea un alt pointer la elementul listă - x. Acum avem două indicatoare. Python utilizează un colector de gunoi cu un număr de referință (apropo, puteți cere să explicați de ce este rău). Când facem del x, dereferențăm doar un singur pointer. Al doilea rămâne. Colecția de gunoi nu va începe, nimic nu se va întâmpla. Guru-ul mă va corecta dacă mă înșel?

Ei bine, de aceea codul face încă următoarele: >>> a = [1, 2, 3, 4]
>>> în timp ce:
. del a [0]
.
.
>>> a
[]

După răspuns, puteți să întrebați cum să procedați în mod normal? Ei bine, pentru a vedea dacă o persoană cunoaște diferența dintre del a și del a [:].

Scrieți un decorator care afișează timpul de execuție al funcției

Ei bine, am pierdut complet întrebările privind cunoștințele de decoratori. Prin urmare, aici o astfel de întrebare nemaipomenită pe ele și data modulului. Nu, nu există capcane. Amintiți-vă înainte și după. Oferiți o persoană Google și implementați-o. Nu vă voi da codul, temele mele: 3

Și ce alte întrebări există? Ei bine, în afară de iubitul fazzbazz, care a învățat deja o jumătate de Runet și nu l-am inclus în post.







Articole similare

Trimiteți-le prietenilor: