introduktion
letar du efter ett Python-jobb? Chansen är stor att du kommer att behöva bevisa att du vet hur man arbetar med Python. Här är ett par frågor som täcker en bred bas av färdigheter i samband med Python. Fokus ligger på själva språket, och inte något särskilt paket eller ramverk. Varje fråga kommer att kopplas till en lämplig handledning om det finns en. Vissa frågor kommer att avsluta flera ämnen.,
Jag har faktiskt inte fått en intervju test ganska så hårt som den här, om du kan få till svaren bekvämt sedan gå skaffa dig ett jobb.
vad denna handledning inte är
denna handledning syftar inte till att täcka alla tillgängliga arbetsplatser kultur-olika arbetsgivare kommer att ställa dig olika frågor på olika sätt; de kommer att följa olika konventioner; de kommer att värdera olika saker. De kommer att testa dig på olika sätt., Vissa arbetsgivare kommer att sätta dig ner från en dator och be dig att lösa enkla problem; vissa kommer att stå upp framför en vit styrelse och göra liknande; vissa kommer att ge dig en take home test för att lösa; vissa kommer bara att ha en konversation med dig.
det bästa testet för en programmerare är faktiskt programmering. Detta är en svår sak att testa med en enkel handledning. Så för bonuspoäng se till att du faktiskt kan använda den funktionalitet som visas i frågorna., Om du faktiskt förstår hur man kommer till svaren tillräckligt bra att du faktiskt kan använda sig av de demonstrerade begreppen då du vinner.
På samma sätt är det bästa testet för en mjukvaruingenjör faktiskt ingenjörskonst. Denna handledning handlar om Python som ett språk. Att kunna utforma effektiva, effektiva, underhållbara klasshierarkier för att lösa nischproblem är stor och underbar och en färdighetsuppsättning värd att driva men långt bortom denna text.
en annan sak denna handledning är inte PEP8 kompatibel., Detta är avsiktligt som, som nämnts tidigare, olika arbetsgivare kommer att följa olika konventioner. Du måste anpassa dig för att passa arbetsplatsens kultur. Eftersom praktiska slår renhet.
en annan sak denna handledning är inte kortfattad. Jag vill inte bara kasta frågor och svar på dig och hoppas att något fastnar. Jag vill att du ska få det, eller åtminstone få det tillräckligt bra att du är i stånd att leta efter ytterligare förklaringar själv för eventuella problemämnen.
vill du ace din tekniska intervju? Schemalägga en teknisk intervju övningssession med en expert nu!,
Fråga 1
vad är Python egentligen? Du kan (och uppmuntras) göra jämförelser med andra tekniker i ditt svar
svar
Här är några viktiga punkter:
-
Python är ett tolkat språk. Det betyder att Python, till skillnad från språk som C och dess varianter, inte behöver sammanställas innan den körs. Andra tolkade språk inkluderar PHP och Ruby.
-
Python skrivs dynamiskt, det betyder att du inte behöver ange typerna av variabler när du deklarerar dem eller något liknande., Du kan göra saker som
x=111
och sedanx="I'm a string"
utan fel -
Python är väl lämpad för objektorienterad programmering genom att den tillåter definition av klasser tillsammans med sammansättning och arv. Python har inte tillgångsspecifierare (som c++’s
public
,private
), motiveringen för denna punkt ges som ”vi är alla vuxna här” -
i Python är funktioner förstklassiga objekt., Detta innebär att de kan tilldelas variabler, returneras från andra funktioner och överföras till funktioner. Klasser är också förstklassiga objekt
-
skriva Python-kod är snabb men kör det är ofta långsammare än kompilerade språk. Lyckligtvis tillåter Python införandet av C-baserade tillägg så flaskhalsar kan optimeras bort och ofta är., Paketet
numpy
är ett bra exempel på detta, det är verkligen ganska snabbt eftersom en hel del av antalet crunching det gör faktiskt inte görs av Python -
Python finner användning i många sfärer – webbapplikationer, automatisering, vetenskaplig modellering, stora dataapplikationer och många fler. Det används också ofta som ”lim” – kod för att få andra språk och Komponenter att spela bra.
-
Python gör svåra saker enkelt så programmerare kan fokusera på övergripande algoritmer och strukturer snarare än nitty-gritty låg nivå detaljer.,
varför det här är viktigt:
om du ansöker om en Python-position borde du veta vad det är och varför det är så gosh-darn cool. Och varför det inte är o.o
fråga 2
fyll i den saknade koden:
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
svar
var särskilt uppmärksam
- överensstämma med dina namnkonventioner. Om det finns en namnkonvention uppenbar i någon provkod, håll dig till den. Även om det inte är namnkonventionen du brukar använda
- rekursiva funktioner måste upprepas och avslutas., Se till att du förstår hur detta händer så att du undviker bottenlösa callstacks
- vi använder
os
– modulen för att interagera med operativsystemet på ett sätt som är plattformsoberoende. Du kan sägasChildPath = sPath + '/' + sChild
men det skulle inte fungera på windows - förtrogenhet med baspaket är verkligen värt, men inte bryta huvudet försöker memorera allt, Google är din vän på arbetsplatsen!
- ställ frågor om du inte förstår vad koden ska göra
- KISS! Håll det enkelt, dumskalle!,
varför det här betyder något:
- visar kunskap om grundläggande operativsystemsinteraktion stuff
- rekursion är hella användbar
fråga 3
titta på nedanstående kod, skriv ner de slutliga värdena för A0, A1, …An.
Om du inte vet vadzip
är inte stress ut. Ingen förnuftig arbetsgivare förväntar dig att memorera standardbiblioteket. Här är produktionen av help(zip)
.
om det inte är meningsfullt tar det några minuter att räkna ut hur du väljer att.,
svar
varför det här är viktigt
- Listförståelse är en underbar tidsbesparare och ett stort hinder för många människor
- Om du kan läsa dem kan du förmodligen skriva ner dem
- en del av den här koden gjordes för att vara medvetet konstig. Du kan behöva arbeta med några konstiga människor
fråga 4
Python och multi-threading. Är det en bra idé? Lista några sätt att få lite Python-kod att köra parallellt.
svar
Python tillåter inte multi-threading i ordets rätta bemärkelse., Den har en multi-threading paket men om du vill multi-threading att snabba upp din kod, då är det oftast inte en bra idé att använda den. Python har en konstruktion som kallas Global Interpreter Lock (GIL). GIL ser till att endast en av dina ”trådar” kan utföra när som helst. En tråd förvärvar GIL, gör lite arbete och passerar sedan GIL på nästa tråd. Detta händer mycket snabbt så att det mänskliga ögat kan tyckas att dina trådar körs parallellt, men de är verkligen bara turas om att använda samma CPU-kärna. Allt GIL passerar lägger overhead till utförande., Det betyder att om du vill få din kod att springa snabbare är det ofta inte en bra idé att använda gängpaketet.
det finns skäl att använda Pythons gängpaket. Om du vill köra vissa saker samtidigt, och effektivitet är inte ett problem, så är det helt bra och bekvämt. Eller om du kör kod som behöver vänta på något (som vissa io) Så kan det göra mycket mening. Men threading-biblioteket låter dig inte använda extra CPU-kärnor.,
Multi-threading kan läggas ut på operativsystemet (genom att göra multi-processing), vissa externa program som kallar din Python-kod (t.ex. gnista eller Hadoop), eller någon kod som din Python-kod anropar (t. ex.: du kan ha din Python-kod kalla en C-funktion som gör de dyra flertrådade grejerna).
varför detta betyder något
eftersom GIL är ett A-hål. Massor av människor spenderar mycket tid på att försöka hitta flaskhalsar i sin snygga Python-gängade kod innan de lär sig vad GIL är.,
fråga 5
hur håller du reda på olika versioner av din kod?
svar:
versionskontroll! Vid denna tidpunkt bör du agera upphetsad och berätta för dem hur du ens använder Git (eller vad som är din favorit) för att hålla reda på korrespondens med Granny. Git är mitt föredragna versionskontrollsystem, men det finns andra, till exempel subversion.
varför det här betyder något:
eftersom kod utan versionskontroll är som kaffe utan kopp., Ibland måste vi skriva en gång kasta bort skript och det är ok, men om du har att göra med någon betydande mängd kod, en version styrsystem kommer att vara en fördel. Versionskontroll hjälper till med att hålla reda på vem som gjorde vilken förändring till kodbasen; ta reda på när buggar introducerades till koden; hålla reda på versioner och versioner av din programvara; distribuera källkoden bland gruppmedlemmar; distribution och vissa automatiseringar. Det låter dig rulla din kod tillbaka till innan du bröt det vilket är bra på egen hand. Massor av saker. Det är bara bra.,
Fråga 6
vad gör denna kod utgång:
def f(x,l=): for i in range(x): l.append(i*i) print(l) f(2)f(3,)f(3)
svar
Hu?
det första funktionsanropet ska vara ganska uppenbart, slingan lägger till 0 och sedan 1 till den tomma listan,l
. l
är ett namn för en variabel som pekar på en lista som lagras i minnet.
det andra samtalet startar genom att skapa en ny lista i ett nytt minnesblock. l
hänvisar sedan till den här nya listan. Den lägger sedan 0, 1 och 4 till den här nya listan. Så det är bra.,
det tredje funktionssamtalet är det konstiga. Den använder den ursprungliga listan lagrad i det ursprungliga minnesblocket. Det är därför det börjar med 0 och 1.
prova detta om du inte förstår:
Fråga 7
vad är apa lappar och är det någonsin en bra idé?
Answer
Monkey patching ändrar beteendet hos en funktion eller ett objekt efter att det redan har definierats. Till exempel:
import datetimedatetime.datetime.now = lambda: datetime.datetime(2012, 12, 12)
För det mesta är det en ganska hemsk idé – det är vanligtvis bäst om saker fungerar på ett väldefinierat sätt. En anledning till apa patch skulle vara i testning., Mock-paketet är mycket användbart för detta ändamål.
varför detta betyder något
det visar att du förstår lite om metoder i enhetstestning. Ditt omnämnande av apa undvikande kommer att visa att du inte är en av de kodare som gynnar fancy kod över underhållbar kod (de är ute, och de suger att arbeta med). Kom ihåg principen om kyss? Och det visar att du vet lite om hur Python fungerar på en lägre nivå, hur funktioner faktiskt lagras och kallas och liknande.
PS: det är verkligen värt att läsa lite om mock om du inte har ännu. Det är ganska användbart.,
Fråga 8
vad betyder det här: *args
, **kwargs
? Och varför skulle vi använda den?
svar
använd*args
när vi inte är säkra på hur många argument som ska skickas till en funktion, eller om vi vill skicka en lagrad lista eller tuple av argument till en funktion. **kwargs
används när vi inte vet hur många sökordsargument som kommer att skickas till en funktion, eller det kan användas för att skicka värdena för en ordbok som sökordsargument., Identifierarna args
ochkwargs
är en konvention, du kan också använda*bob
och**billy
men det skulle inte vara klokt.
Här är en liten illustration:
Varför bryr du dig?
Ibland måste vi skicka ett okänt antal argument eller sökordsargument till en funktion. Ibland vill vi lagra argument eller sökordsargument för senare användning. Ibland är det bara en tidsbesparare.,
fråga 9
vad betyder det för dig:@classmethod
,@staticmethod
,@property
?
svara på bakgrundskunskap
det här är dekoratörer. En dekoratör är en speciell typ av funktion som antingen tar en funktion och returnerar en funktion, eller tar en klass och returnerar en klass. Symbolen@
är bara syntaktiskt socker som låter dig dekorera något på ett sätt som är lätt att läsa.,
@my_decoratordef my_func(stuff): do_things
motsvarar
def my_func(stuff): do_thingsmy_func = my_decorator(my_func)
Du kan hitta en handledning om hur dekoratörer i allmänhet arbetar här.
faktiskt svar
dekoratörerna@classmethod
,@staticmethod
och@property
används på funktioner som definieras inom klasser. Här är hur de beter sig:
Fråga 10
Tänk på följande kod, vad kommer den att mata ut?
svar
utmatningen anges i kommentarerna i segmentet nedan:
Varför bryr vi oss?,
eftersom oo programmering är verkligen, verkligen viktigt. På riktigt?. Att svara på denna fråga visar din förståelse för arv och användningen av Pythons super
– funktion. För det mesta spelar upplösningsordningen ingen roll. Ibland beror det på din ansökan.
fråga 11
Tänk på följande kod, vad kommer den att mata ut?
svar
oRoot.print_all_1()
skriver ut:
oRoot.print_all_2()
skriver ut:
varför bryr vi oss?
eftersom sammansättning och objektkonstruktion är vad objekt handlar om., Objekt består av saker och de måste initieras på något sätt. Detta binder också upp några saker om rekursion och användning av generatorer.
generatorer är bra. Du kunde ha uppnått liknande funktionalitet som print_all_2
genom att bara bygga en stor lång lista och sedan skriva ut dess innehåll. En av de fina sakerna med generatorer är att de inte behöver ta upp mycket utrymme i minnet.
det är också värt att påpeka att print_all_1
korsar trädet på ett djup-första sätt, medan print_all_2
är Bredd-först., Se till att du förstår dessa villkor. Ibland är en typ av traversal lämpligare än den andra. Men det beror väldigt mycket på din ansökan.
Fråga 12
beskriv Pythons sophämtningsmekanism i korthet.
svar
mycket kan sägas här. Det finns några huvudpunkter som du bör nämna:
- Python upprätthåller en räkning av antalet referenser till varje objekt i minnet., Om ett referensantal går till noll är det associerade objektet inte längre levande och minnet som tilldelas det objektet kan frigöras för något annat
- ibland händer saker som kallas ”referenscykler”. Sophämtaren söker regelbundet efter dessa och rensar dem. Ett exempel skulle vara om du har två objekt
o1
ocho2
så atto1.x == o2
ocho2.x == o1
. Omo1
ocho2
inte refereras av något annat bör de inte vara live., Men var och en av dem har en referensräkning på 1. - vissa heuristik används för att påskynda sophämtning. Till exempel är nyligen skapade objekt mer benägna att vara döda. När objekt skapas tilldelar skräpsamlaren dem till generationer. Varje objekt får en generation och yngre generationer behandlas först.
denna förklaring är CPython specifik.
fråga 13
placera följande funktioner nedan i ordning efter deras effektivitet. De tar alla in en lista med siffror mellan 0 och 1. Listan kan vara ganska lång., En exempelinmatningslista skulle vara . Hur skulle du bevisa att ditt svar är korrekt?
svar
mest till minst effektiv: f2
, f1
, f3
. För att bevisa att så är fallet vill du profilera din kod. Python har en härlig profilering paket som bör göra susen.
import cProfilelIn = cProfile.run('f1(lIn)')cProfile.run('f2(lIn)')cProfile.run('f3(lIn)')
för slutförandets skull, här är vad ovanstående profilutgångar:
Varför bryr du dig?
att hitta och undvika flaskhalsar är ofta ganska värdefullt., Mycket kodning för effektivitet kommer ner till sunt förnuft – i exemplet ovan är det uppenbarligen snabbare att sortera en lista om det är en mindre lista, så om du har valet att filtrera före ett slag är det ofta en bra idé. De mindre uppenbara sakerna kan fortfarande placeras med hjälp av rätt verktyg. Det är bra att veta om dessa verktyg.
fråga 14
något du misslyckades med?
fel svar
jag misslyckas aldrig!
varför detta är viktigt:
visar att du kan erkänna fel, ta ansvar för dina misstag och lära av dina misstag., Alla dessa saker är ganska jäkligt viktiga om du ska vara användbar. Om du är faktiskt perfekt då synd, kan du behöva få kreativa här.
fråga 15
har du några personliga projekt?
verkligen?
detta visar att du är villig att göra mer än det minsta när det gäller att hålla din skillset uppdaterad. Om du arbetar med personliga projekt och kod utanför arbetsplatsen då arbetsgivare är mer benägna att se dig som en tillgång som kommer att växa. Även om de inte ställer den här frågan tycker jag att det är användbart att ta upp ämnet.,
slutsats
dessa frågor berörde avsiktligt många ämnen. Och svaren var avsiktligt verbose. I en programmeringsintervju måste du visa din förståelse och om du kan göra det på ett kortfattat sätt så gör det med alla medel. Jag försökte ge tillräckligt med information i svaren som du kunde få fram någon mening från dem, även om du aldrig hade hört talas om några av dessa ämnen tidigare. Jag hoppas att du hittar det här användbart i din jobbjakt.
gå och hämta dem tiger.