Úvod

hledáte Python práci? Je pravděpodobné, že budete muset prokázat, že víte, jak pracovat s Pythonem. Zde je několik otázek, které pokrývají širokou základnu dovedností spojených s Pythonem. Důraz je kladen na samotný jazyk, nikoli na žádný konkrétní balíček nebo rámec. Každá otázka bude spojena s vhodným tutoriálem, pokud existuje. Některé otázky budou zabalit více témat.,

ve skutečnosti jsem nedostal pohovorový test tak tvrdý jako tento, pokud se můžete pohodlně dostat k odpovědím, pak si najděte práci.

Co Tento tutoriál není

Tento tutoriál nemá za cíl pokrýt každou dostupnou kulturu pracoviště-různí zaměstnavatelé vám budou klást různé otázky různými způsoby; budou se řídit různými konvencemi; budou si vážit různých věcí. Budou vás testovat různými způsoby., Někteří zaměstnavatelé se posaďte před počítač a požádat vás, abyste řešit jednoduché problémy, někteří budou stát v přední části bílé tabule a podobně; některé vám vzít domů vyzkoušet vyřešit, některé se jen s tebou bavit.

nejlepší test pro programátora je ve skutečnosti programování. To je obtížná věc, kterou můžete vyzkoušet pomocí jednoduchého tutoriálu. Takže pro bonusové body se ujistěte, že můžete skutečně použít funkci demonstrovanou v otázkách., Pokud skutečně chápete, jak se dostat k odpovědím natolik dobře, že můžete skutečně využít demonstrovaných konceptů, pak vyhráváte.

podobně nejlepším testem softwarového inženýra je ve skutečnosti inženýrství. Tento tutoriál je o Pythonu jako jazyce. Být schopen navrhnout účinného, efektivního, udržovatelného třídy hierarchie pro řešení specializovaných problémů je skvělé a nádherné, a dovednost nastavit stojí za to pokračovat, ale i mimo rámec tohoto textu.

Další věc, kterou tento tutoriál není, je kompatibilní s PEP8., To je úmyslné, protože, jak již bylo zmíněno dříve, různí zaměstnavatelé budou dodržovat různé konvence. Budete se muset přizpůsobit kultuře pracoviště. Protože praktičnost překonává čistotu.

Další věc, kterou tento tutoriál není, je stručná. Nechci na tebe jen házet otázky a odpovědi a doufat, že se něco drží. Chci, abyste si to, nebo alespoň si to dost dobře, že jste v pozici hledat další vysvětlení sami pro případných problémových témat.

Chcete eso váš technický rozhovor? Naplánujte si technický rozhovor s odborníkem nyní!,

Otázka 1

Co je Python opravdu? Můžete (a doporučuje se) vytvořit srovnání s jinými technologiemi ve své odpovědi

Odpověď

Zde je několik klíčových bodů:

  • Python je interpretovaný jazyk. To znamená, že na rozdíl od jazyků jako C a jeho variant nemusí být Python před spuštěním kompilován. Mezi další interpretované jazyky patří PHP a Ruby.

  • Python je dynamicky zadán, to znamená, že při jejich deklaraci nebo podobně nemusíte uvádět typy proměnných., Můžete dělat věci, jako je x=111 x="I'm a string" bez chyby,

  • Python je vhodný pro objektově orientované programování v tom, že umožňuje definici třídy spolu s složení a dědictví. Python nemá přístup specifikátory (stejně jako C++je public private), odůvodnění tento bod je uveden jako „my jsme všichni dospělí tady,“

  • V Pythonu, funkce jsou first-class objekty., To znamená, že mohou být přiřazeny proměnným, vráceny z jiných funkcí a předány do funkcí. Třídy jsou také objekty první třídy

  • psaní kódu Python je rychlé, ale běh je často pomalejší než zkompilované jazyky. Naštěstí Python umožňuje zahrnutí rozšíření založených na C, takže úzká místa mohou být optimalizována a často jsou., numpy balíček je dobrým příkladem toho, je to docela rychlé, protože hodně z číslo křupavý, to není ve skutečnosti provádí pomocí Pythonu

  • Python najde použití v mnoha oblastech – webové aplikace, automatizace, vědecké modelování, velké datové aplikace a mnoho dalších. To je také často používán jako“ lepidlo “ kód získat jiné jazyky a komponenty hrát hezky.

  • Python dělá obtížné věci snadné, takže programátoři se mohou zaměřit na převažující algoritmy a struktury, spíše než nitty-kostrbatý detaily nízké úrovni.,

proč na tom záleží:

Pokud žádáte o pozici Pythonu, měli byste vědět, co to je a proč je tak zatraceně cool. A proč to není o.O

Otázka 2

doplňte chybějící kód:

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

Odpověď

Věnujte Zvláštní Pozornost

  • Být v souladu s vaší konvence pojmenování. Pokud existuje konvence pojmenování patrná v jakémkoli vzorovém kódu, držte se ho. I když to není konvence pojmenování obvykle používáte
  • rekurzivní funkce je třeba opakovat a ukončit., Ujistěte se, že jste pochopili, jak se to stane tak, že se vyhnete bezedné callstacks
  • Můžeme použít os modul pro interakci s operačním systémem, způsobem, který je multiplatformní. Můžete říci, sChildPath = sPath + '/' + sChild, ale to nebude fungovat na windows
  • Seznámení se s základní balíčky je opravdu stojí za to, ale ne rozbít hlavu, snaží se zapamatovat si všechno, Google je váš přítel na pracovišti!
  • Ptejte se, pokud nechápete, co má kód dělat
  • polibek! Nech to být, hlupáku!,

Proč na tom Záleží:

  • Zobrazí znalost základní operační systém, interakce
  • Rekurze je hella užitečné

3

při Pohledu na níže kód, poznamenejte si konečné hodnoty A0, A1, …An.

Pokud nevíte, co zip je nestresuj se. Žádný rozumný zaměstnavatel neočekává, že si zapamatujete standardní knihovnu. Zde je výstup help(zip).

pokud to nedává smysl, pak to trvá několik minut, než to zjistíte, ale rozhodnete se.,

Odpověď

Proč na tom Záleží

  1. Seznam porozumění je skvělý spořič času a velký kámen úrazu pro mnoho lidí,
  2. Pokud můžete číst, můžete pravděpodobně psát je dolů
  3. Některé tento kód byl proveden záměrně divné. Možná budete muset pracovat s některými podivnými lidmi

otázka 4

Python a multi-threading. Je to dobrý nápad? Seznam některých způsobů, jak získat nějaký Python kód spustit paralelně.

odpověď

Python neumožňuje multi-threading v pravém slova smyslu., Má multi-threading balíček, ale pokud chcete Multi-thread urychlit svůj kód, pak to obvykle není dobrý nápad, aby jej použít. Python má konstrukt nazvaný Global Interpreter Lock (GIL). GIL zajišťuje, že pouze jeden z vašich „vláken“ může být proveden kdykoli. Vlákno získává GIL, dělá trochu práce, pak prochází GIL na další vlákno. To se děje velmi rychle, takže pro lidské oko se může zdát, že vaše vlákna probíhají paralelně, ale ve skutečnosti se jen střídají pomocí stejného jádra CPU. To vše GIL absolvování přidává režii k provedení., To znamená, že pokud chcete, aby váš kód běžel rychleji, pak použití balíčku závitů často není dobrý nápad.

existují důvody pro použití pythonova závitového balíčku. Pokud chcete spustit některé věci současně a účinnost není problém, pak je to naprosto v pořádku a pohodlné. Nebo pokud používáte kód, který potřebuje na něco počkat (jako nějaký IO), pak by to mohlo mít smysl. Ale Knihovna závitů vám nedovolí používat další jádra CPU.,

Multi-threading může být externě operační systém (tím, že dělá multi-processing), některé externí aplikace, která volá váš Python kód (např, Jiskra nebo Hadoop), nebo nějaký kód, který váš Python kód volání (např: ty by mohly mít váš Python kód volání C funkce, která nemá na drahé multi-threaded).

proč na tom záleží

protože GIL je a-díra. Spousta lidí tráví spoustu času se snaží najít úzká místa v jejich fantazie Python multi-threaded kódu, než se dozví, co GIL je.,

otázka 5

jak sledujete různé verze kódu?

odpověď:

Version control! V tomto okamžiku byste měli jednat nadšeně a říct jim, jak dokonce používáte Git (nebo co je vaše oblíbené), abyste sledovali korespondenci s babičkou. Git je můj preferovaný systém pro správu verzí, ale existují i jiné, například subversion.

proč na tom záleží:

protože kód bez kontroly verze je jako káva bez šálku., Někdy musíme napsat jednou-off zahodit skripty a to je v pořádku, ale pokud máte co do činění s žádné významné množství kódu, verzovací systém bude přínosem. Verze Control pomáhá udržet přehled o tom, kdo udělal to, co změna kódu základny; zjistit, když chyby byly zavedeny do kódu, sledování verzí a verzí softwaru; distribuce zdrojového kódu mezi členy týmu; nasazení a určité automatizace. To vám umožní vrátit kód zpět, než jste ho zlomili, což je skvělé samo o sobě. Spousta věcí. Je to prostě skvělé.,

6

to, Co dělá tento kód výstupu:

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

Odpověď

Hu?

první volání funkce by mělo být poměrně zřejmé, smyčka připojí 0 a pak 1 do prázdného seznamu, l. l je název proměnné, která ukazuje na seznam uložený v paměti.
druhý hovor se spustí vytvořením nového seznamu v novém bloku paměti. l pak odkazuje na tento nový seznam. To pak připojí 0, 1 a 4 k tomuto novému seznamu. Takže to je skvělé.,
třetí volání funkce je divné. Používá původní seznam uložený v původním paměťovém bloku. To je důvod, proč to začíná s 0 a 1.

Vyzkoušejte to, pokud nerozumíte:

otázka 7

Co je to opice záplatování a je to někdy dobrý nápad?

odpověď

Oprava opice mění chování funkce nebo objektu poté, co již byla definována. Například:

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

většinou je to docela hrozný nápad-obvykle je nejlepší, když věci jednají dobře definovaným způsobem. Jedním z důvodů pro opičí náplast by bylo testování., Falešný balíček je pro tento účel velmi užitečný.

proč na tom záleží

ukazuje, že trochu rozumíte metodikám při testování jednotek. Vaše zmínka o opice vyhýbání se ukáže, že nejste jeden z těch programátorů, kteří upřednostňují chuť kód udržovatelný kód (jsou tam venku, a oni sát pracovat s). Vzpomínáte si na princip polibku? A ukazuje, že víte trochu o tom, jak Python funguje na nižší úrovni, jak jsou funkce skutečně uloženy a volány a podobně.

PS: Je to opravdu stojí za to číst trochu o mock, pokud jste dosud. Je to docela užitečné.,

otázka 8

Co to znamená: *args, **kwargs? A proč bychom ho měli používat?

Odpověď

Použití *args když si nejsme jisti, kolik argumenty, budou předány funkci, nebo chceme-li přenést uložené v seznamu nebo n-tice argumentů do funkce. **kwargs se používá, když nevíme, kolik klíčových argumentů bude předáno do funkce,nebo může být použito k předání hodnot slovníku jako klíčových argumentů., Identifikátory args kwargs jsou úmluvou, můžete také použít *bob **billy, ale to by nebylo moudré.

zde je malá ilustrace:

proč se starat?

někdy budeme muset do funkce předat neznámý počet argumentů nebo argumentů klíčových slov. Někdy budeme chtít uložit argumenty nebo argumenty klíčových slov pro pozdější použití. Někdy je to jen spořič času.,

Otázka 9

Co to znamená pro vás: @classmethod @staticmethod @property?

odpověď znalosti pozadí

jedná se o dekoratéry. Dekoratér je speciální druh funkce, která buď vezme funkci a vrátí funkci, nebo vezme třídu a vrátí třídu. Symbol @ je jen syntaktický cukr, který vám umožní zdobit něco způsobem, který je snadno čitelný.,

@my_decoratordef my_func(stuff): do_things

je ekvivalentní

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

zde najdete návod, jak dekoratéři obecně pracují.

Skutečná Odpověď

malíři @classmethod @staticmethod @property jsou použity na funkce definované uvnitř třídy. Zde je návod, jak se chovají:

otázka 10

zvažte následující kód,co bude výstup?

odpověď

výstup je uveden v komentářích v níže uvedeném segmentu:

proč nám záleží?,

protože programování OO je opravdu, opravdu důležité. Opravdu. Odpověď na tuto otázku ukazuje vaše chápání dědičnosti a použití funkce Python super. Většinou nezáleží na pořadí řešení. Někdy to dělá, záleží na vaší aplikaci.

otázka 11

zvažte následující kód,co bude výstup?

odpověď

oRoot.print_all_1() tisky:

oRoot.print_all_2() tisky:

proč se staráme?

protože složení a konstrukce objektů je to, o čem jsou objekty., Objekty jsou složeny z věcí a je třeba je nějak inicializovat. To také spojuje některé věci o rekurzi a použití generátorů.

generátory jsou skvělé. Mohl jste dosáhnout podobné funkce, aby print_all_2 právě staví velký dlouhý seznam a pak tisk je obsah. Jedna z pěkných věcí na generátorech je, že nepotřebují zabírat mnoho místa v paměti.

je také třeba zdůraznit, že print_all_1 prohledávání stromu do hloubky-první způsobem, zatímco print_all_2 je šířka-první., Ujistěte se, že rozumíte těmto podmínkám. Někdy je jeden druh traversalu vhodnější než druhý. Ale to velmi záleží na vaší aplikaci.

otázka 12

stručně popište mechanismus sběru odpadků Pythonu.

odpověď

zde lze říci hodně. Existuje několik hlavních bodů, které byste měli zmínit:

  • Python udržuje počet referencí na každý objekt v paměti., Pokud referenční počet přejde na nulu, pak přidružený objekt již není živý a paměť přidělená tomuto objektu může být uvolněna pro něco jiného
  • občas se stane něco, co se nazývá „referenční cykly“. Sběrač odpadků je pravidelně hledá a vyčistí. Příkladem by mohl být, pokud máte dva objekty, o1 o2 o1.x == o2 o2.x == o1. Pokud o1 a o2 nejsou odkazovány ničím jiným, pak by neměly být živé., Ale každý z nich má referenční počet 1.
  • určité heuristiky se používají k urychlení sběru odpadků. Například nedávno vytvořené objekty jsou s větší pravděpodobností mrtvé. Při vytváření objektů je sběrač odpadků přiřazuje generacím. Každý objekt dostane jednu generaci a mladší generace jsou řešeny jako první.

toto vysvětlení je specifické pro CPython.

otázka 13

umístěte následující funkce níže v pořadí jejich účinnosti. Všichni mají seznam čísel mezi 0 a 1. Seznam může být poměrně dlouhý., Příklad vstupního seznamu by byl . Jak byste dokázal, že vaše odpověď je správná?

Odpověď

Nejvíce k nejméně efektivní: f2 f1 f3. Chcete-li prokázat, že tomu tak je, chcete profilovat svůj kód. Python má krásný profilovací balíček, který by měl udělat trik.

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

pro dokončení je to, co výše uvedené výstupy profilu:

proč se starat?

hledání a vyhýbání se úzkým místům je často docela užitečné., Hodně kódování pro efektivitu přijde k rozumu – v příkladu výše je to samozřejmě rychlejší řazení seznamu, pokud je to menší seznam, takže pokud máte na výběr, filtrování, než jakési to je často dobrý nápad. Méně zřejmé věci mohou být stále umístěny pomocí správných nástrojů. Je dobré vědět o těchto nástrojích.

otázka 14

něco, co se vám nepodařilo?

špatná odpověď

nikdy nezklamu!

proč je to důležité:

ukazuje, že jste schopni přiznat chyby, převzít odpovědnost za své chyby a poučit se z vašich chyb., Všechny tyto věci jsou zatraceně důležité, pokud se chystáte být užitečné. Pokud jste skutečně perfektní, pak škoda, možná budete muset být kreativní.

otázka 15

máte nějaké osobní projekty?

opravdu?

to ukazuje, že jste ochotni udělat více než holé minimum, pokud jde o udržení své skillset aktuální. Pokud pracujete na osobních projektech a kódu mimo pracoviště, zaměstnavatelé vás pravděpodobně uvidí jako aktivum, které poroste. I když se na tuto otázku neptají, považuji za užitečné protahovat předmět.,

závěr

tyto otázky se záměrně dotkly mnoha témat. A odpovědi byly záměrně upovídané. V programovém rozhovoru budete muset prokázat své porozumění a pokud to dokážete stručným způsobem, pak to všemi prostředky udělejte. Snažil jsem se poskytnout dostatek informací v odpovědích, které byste od nich mohli získat nějaký význam, i když jste o některých z těchto témat nikdy předtím neslyšeli. Doufám, že vám to přijde užitečné při hledání práce.

jdi pro tygra.

Articles

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *