Introduzione
Alla ricerca di un lavoro Python? Le probabilità sono che sarà necessario dimostrare che si sa come lavorare con Python. Ecco un paio di domande che coprono un’ampia base di competenze associate a Python. L’attenzione è posta sulla lingua stessa e non su un particolare pacchetto o framework. Ogni domanda sarà collegata a un tutorial adatto se ce n’è uno. Alcune domande si concludono più argomenti.,
In realtà non mi è stato dato un test di intervista così difficile come questo, se riesci a ottenere le risposte comodamente, vai a trovarti un lavoro.
Ciò che questo tutorial non è
Questo tutorial non mira a coprire ogni cultura del posto di lavoro disponibile – diversi datori di lavoro ti faranno domande diverse in modi diversi; seguiranno diverse convenzioni; valuteranno cose diverse. Ti metteranno alla prova in modi diversi., Alcuni datori di lavoro ti siederanno da un computer e ti chiederanno di risolvere problemi semplici; alcuni ti staranno di fronte a una lavagna bianca e faranno simili; alcuni ti daranno un test da portare a casa per risolvere; alcuni avranno solo una conversazione con te.
Il miglior test per un programmatore è in realtà la programmazione. Questa è una cosa difficile da testare con un semplice tutorial. Quindi, per i punti bonus, assicurati di poter effettivamente utilizzare la funzionalità dimostrata nelle domande., Se effettivamente capire come arrivare alle risposte abbastanza bene che si può effettivamente fare uso dei concetti dimostrati allora si sta vincendo.
Allo stesso modo, il miglior test per un ingegnere del software è in realtà l’ingegneria. Questo tutorial parla di Python come linguaggio. Essere in grado di progettare gerarchie di classe efficienti, efficaci e mantenibili per risolvere problemi di nicchia è grande e meraviglioso e un set di abilità che vale la pena perseguire, ma ben oltre lo scopo di questo testo.
Un’altra cosa che questo tutorial non è conforme a PEP8., Questo è intenzionale come, come accennato prima, diversi datori di lavoro seguiranno diverse convenzioni. Dovrai adattarti per adattarti alla cultura del posto di lavoro. Perché la praticità batte la purezza.
Un’altra cosa che questo tutorial non è è concisa. Non voglio solo lanciarti domande e risposte e sperare che qualcosa si attacchi. Voglio che tu lo ottenga, o almeno lo ottenga abbastanza bene da essere in grado di cercare ulteriori spiegazioni per eventuali argomenti problematici.
Vuoi fare il tuo colloquio tecnico? Pianificare una sessione di pratica intervista tecnica con un esperto ora!,
Domanda 1
Cos’è veramente Python? Puoi (e sei incoraggiato) fare confronti con altre tecnologie nella tua risposta
Risposta
Ecco alcuni punti chiave:
-
Python è un linguaggio interpretato. Ciò significa che, a differenza di linguaggi come C e le sue varianti, Python non ha bisogno di essere compilato prima di essere eseguito. Altri linguaggi interpretati includono PHP e Ruby.
-
Python viene digitato dinamicamente, questo significa che non è necessario indicare i tipi di variabili quando le si dichiara o qualcosa del genere., Puoi fare cose come
x=111
e poix="I'm a string"
senza errori -
Python è adatto alla programmazione orientata agli oggetti in quanto consente la definizione di classi insieme alla composizione e all’ereditarietà. Python non ha specificatori di accesso (come C++’s
public
,private
), la giustificazione per questo punto è data come”siamo tutti adulti qui” -
In Python, le funzioni sono oggetti di prima classe., Ciò significa che possono essere assegnati a variabili, restituiti da altre funzioni e passati in funzioni. Le classi sono anche oggetti di prima classe
-
La scrittura del codice Python è veloce ma l’esecuzione è spesso più lenta dei linguaggi compilati. Fortunatamente, Python consente l’inclusione di estensioni basate su C in modo che i colli di bottiglia possano essere ottimizzati e spesso lo sono., Il pacchetto
numpy
è un buon esempio di questo, è davvero abbastanza veloce perché gran parte del numero di scricchiolii che fa non è effettivamente fatto da Python -
Python trova uso in molti ambiti: applicazioni Web, automazione, modellazione scientifica, applicazioni di big data e molti altri. È anche spesso usato come codice “colla” per far funzionare bene altre lingue e componenti.
-
Python rende le cose difficili facili in modo che i programmatori possano concentrarsi sulla sovrascrittura di algoritmi e strutture piuttosto che dettagli di basso livello.,
Perché questo è importante:
Se stai facendo domanda per una posizione Python, dovresti sapere di cosa si tratta e perché è così dannatamente bello. E perché non lo è o.O
Domanda 2
Inserisci il codice mancante:
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
Risposta
Presta particolare attenzione
- Sii coerente con le tue convenzioni di denominazione. Se esiste una convenzione di denominazione evidente in qualsiasi codice di esempio, attenersi ad essa. Anche se non è la convenzione di denominazione, di solito si usano le funzioni ricorsive
- che devono essere ricorsive e terminate., Assicurati di capire come ciò accade in modo da evitare i callstack senza fondo
- Usiamo il modulo
os
per interagire con il sistema operativo in un modo multipiattaforma. Potresti diresChildPath = sPath + '/' + sChild
ma non funzionerebbe su Windows - La familiarità con i pacchetti base è davvero utile, ma non rompere la testa cercando di memorizzare tutto, Google è tuo amico sul posto di lavoro!
- Fai domande se non capisci cosa dovrebbe fare il codice
- KISS! Sii semplice, stupido!,
Perché Questo è importante:
- Visualizza conoscenza di base del sistema operativo interazione roba
- la Ricorsione è hella utili
Domanda 3
Guardando il codice qui sotto, scrivere il finale valori di A0, A1,…, An.
Se non sai cosa zip
don’t stress. Nessun datore di lavoro sano di mente si aspetta di memorizzare la libreria standard. Ecco l’output di help(zip)
.
Se ciò non ha senso, prenditi qualche minuto per capirlo come preferisci.,
Risposta
Perché questo è importante
- La comprensione delle liste è un meraviglioso risparmio di tempo e un grande ostacolo per molte persone
- Se riesci a leggerle, probabilmente puoi scriverle
- Alcuni di questo codice sono stati fatti per essere volutamente strani. Potrebbe essere necessario lavorare con alcune persone strane
Domanda 4
Python e multi-threading. E ‘ una buona idea? Elenca alcuni modi per ottenere un codice Python da eseguire in modo parallelo.
Risposta
Python non consente il multi-threading nel vero senso della parola., Ha un pacchetto multi-threading ma se vuoi multi-thread per accelerare il tuo codice, di solito non è una buona idea usarlo. Python ha un costrutto chiamato Global Interpreter Lock (GIL). Il GIL si assicura che solo uno dei tuoi “thread” possa essere eseguito in qualsiasi momento. Un thread acquisisce il GIL, fa un po ‘ di lavoro, quindi passa il GIL sul thread successivo. Ciò accade molto rapidamente, quindi all’occhio umano può sembrare che i tuoi thread stiano eseguendo in parallelo, ma in realtà stanno solo facendo a turno usando lo stesso core della CPU. Tutto questo passaggio di GIL aggiunge overhead all’esecuzione., Ciò significa che se vuoi rendere il tuo codice più veloce, usare il pacchetto di threading spesso non è una buona idea.
Ci sono ragioni per usare il pacchetto di threading di Python. Se si desidera eseguire alcune cose contemporaneamente, e l’efficienza non è una preoccupazione, allora è totalmente bene e conveniente. O se stai eseguendo un codice che deve aspettare qualcosa (come un IO), allora potrebbe avere molto senso. Ma la libreria di threading non ti consente di utilizzare core CPU extra.,
Il multi-threading può essere esternalizzato al sistema operativo (facendo multi-processing), qualche applicazione esterna che chiama il tuo codice Python (ad esempio, Spark o Hadoop), o qualche codice che il tuo codice Python chiama (ad esempio: potresti avere il tuo codice Python chiamare una funzione C che fa le costose cose multi-threaded).
Perché questo è importante
Perché il GIL è un buco A. Molte persone passano molto tempo a cercare di trovare i colli di bottiglia nel loro codice multi-thread Python prima di imparare cos’è il GIL.,
Domanda 5
Come tieni traccia delle diverse versioni del tuo codice?
Risposta:
Controllo versione! A questo punto, dovresti agire eccitato e dire loro come usi anche Git (o qualsiasi altra cosa sia la tua preferita) per tenere traccia della corrispondenza con la nonna. Git è il mio sistema di controllo della versione preferito, ma ce ne sono altri, ad esempio subversion.
Perché questo è importante:
Perché il codice senza controllo della versione è come il caffè senza tazza., A volte abbiamo bisogno di scrivere script monouso e va bene, ma se hai a che fare con una quantità significativa di codice, un sistema di controllo della versione sarà un vantaggio. Il controllo di versione aiuta a tenere traccia di chi ha apportato la modifica alla base di codice; scoprire quando sono stati introdotti bug nel codice; tenere traccia delle versioni e delle versioni del software; distribuire il codice sorgente tra i membri del team; distribuzione e alcune automazioni. Ti permette di ripristinare il tuo codice prima di romperlo, il che è fantastico da solo. Un sacco di roba. E ‘ semplicemente fantastico.,
Domanda 6
Cosa produce questo codice:
def f(x,l=): for i in range(x): l.append(i*i) print(l) f(2)f(3,)f(3)
Risposta
Hu?
La prima chiamata di funzione dovrebbe essere abbastanza ovvia, il ciclo aggiunge 0 e poi 1 alla lista vuota, l
. l
è un nome per una variabile che punta a un elenco memorizzato in memoria.
La seconda chiamata inizia creando un nuovo elenco in un nuovo blocco di memoria. l
fa quindi riferimento a questo nuovo elenco. Quindi aggiunge 0, 1 e 4 a questo nuovo elenco. Quindi e ‘ fantastico.,
La terza chiamata di funzione è quella strana. Utilizza l’elenco originale memorizzato nel blocco di memoria originale. Ecco perché inizia con 0 e 1.
Prova questo se non capisci:
Domanda 7
Cos’è il patching delle scimmie ed è mai una buona idea?
Risposta
La patch di scimmia sta cambiando il comportamento di una funzione o di un oggetto dopo che è già stato definito. Ad esempio:
import datetimedatetime.datetime.now = lambda: datetime.datetime(2012, 12, 12)
La maggior parte delle volte è un’idea piuttosto terribile – di solito è meglio se le cose agiscono in modo ben definito. Una ragione per scimmia patch sarebbe in fase di test., Il pacchetto finto è molto utile a tal fine.
Perché questo è importante
Mostra che capisci un po ‘ delle metodologie nei test unitari. La tua menzione di monkey avoidance mostrerà che non sei uno di quei programmatori che favoriscono il codice di fantasia rispetto al codice manutenibile (sono là fuori, e fanno schifo con cui lavorare). Ricorda il principio del BACIO? E mostra che sai un po ‘ come funziona Python a un livello inferiore, come le funzioni sono effettivamente memorizzate e chiamate e simili.
PS: vale davvero la pena leggere un po ‘ di mock se non l’hai ancora fatto. E ‘ piuttosto utile.,
Domanda 8
Cosa significa questa roba:*args
,**kwargs
? E perche ‘ dovremmo usarlo?
Rispondi
Usa*args
quando non siamo sicuri di quanti argomenti verranno passati a una funzione, o se vogliamo passare un elenco memorizzato o una tupla di argomenti a una funzione. **kwargs
è usato quando non sappiamo quanti argomenti di parole chiave saranno passati a una funzione, o può essere usato per passare i valori di un dizionario come argomenti di parole chiave., Gli identificatoriargs
ekwargs
sono una convenzione, potresti anche usare*bob
e**billy
ma non sarebbe saggio.
Ecco una piccola illustrazione:
Perché preoccuparsi?
A volte dovremo passare un numero sconosciuto di argomenti o argomenti di parole chiave in una funzione. A volte vorremo memorizzare argomenti o argomenti di parole chiave per un uso successivo. A volte è solo un risparmio di tempo.,
Domanda 9
Cosa significano per te:@classmethod
,@staticmethod
,@property
?
Risposta Conoscenza di base
Questi sono decoratori. Un decoratore è un tipo speciale di funzione che prende una funzione e restituisce una funzione, o prende una classe e restituisce una classe. Il simbolo@
è solo zucchero sintattico che ti permette di decorare qualcosa in un modo facile da leggere.,
@my_decoratordef my_func(stuff): do_things
È equivalente a
def my_func(stuff): do_thingsmy_func = my_decorator(my_func)
Puoi trovare un tutorial su come funzionano i decoratori in generale qui.
Risposta effettiva
I decoratori @classmethod
, @staticmethod
e @property
vengono utilizzati su funzioni definite all’interno delle classi. Ecco come si comportano:
Domanda 10
Considera il seguente codice, cosa emetterà?
Risposta
L’output è specificato nei commenti nel segmento sottostante:
Perché ci interessa?,
Perché la programmazione OO è davvero, davvero importante. Davvero. Rispondere a questa domanda mostra la tua comprensione dell’ereditarietà e l’uso della funzione super
di Python. La maggior parte delle volte l’ordine di risoluzione non ha importanza. A volte lo fa, dipende dalla tua applicazione.
Domanda 11
Considera il seguente codice, cosa emetterà?
Risposta
oRoot.print_all_1()
stampe:
oRoot.print_all_2()
stampe:
Perché ci interessa?
Perché la composizione e la costruzione di oggetti sono ciò che gli oggetti sono tutti circa., Gli oggetti sono composti da cose e devono essere inizializzati in qualche modo. Questo lega anche alcune cose sulla ricorsione e l’uso dei generatori.
I generatori sono fantastici. Avresti potuto ottenere funzionalità simili aprint_all_2
semplicemente costruendo una lunga lista e quindi stampando i suoi contenuti. Una delle cose belle dei generatori è che non hanno bisogno di occupare molto spazio in memoria.
Vale anche la pena sottolineare che print_all_1
attraversa l’albero in modo depth-first, mentre print_all_2
è width-first., Assicurati di capire quei termini. A volte un tipo di traversata è più appropriato dell’altro. Ma questo dipende molto dalla tua applicazione.
Domanda 12
Descrivere il meccanismo di garbage collection di Python in breve.
Risposta
Si può dire molto qui. Ci sono alcuni punti principali che dovresti menzionare:
- Python mantiene un conteggio del numero di riferimenti a ciascun oggetto in memoria., Se un conteggio di riferimento va a zero, l’oggetto associato non è più attivo e la memoria allocata a quell’oggetto può essere liberata per qualcos’altro
- occasionalmente accadono cose chiamate “cicli di riferimento”. Il garbage collector cerca periodicamente questi e li pulisce. Un esempio potrebbe essere se hai due oggetti
o1
eo2
tali cheo1.x == o2
eo2.x == o1
. Seo1
eo2
non sono referenziati da nient’altro, allora non dovrebbero essere live., Ma ognuno di loro ha un conteggio di riferimento di 1. - Alcune euristiche vengono utilizzate per accelerare la garbage collection. Ad esempio, gli oggetti creati di recente hanno maggiori probabilità di essere morti. Quando gli oggetti vengono creati, il garbage collector li assegna alle generazioni. Ogni oggetto ottiene una generazione e le generazioni più giovani vengono trattate per prime.
Questa spiegazione è specifica per CPython.
Domanda 13
Inserire le seguenti funzioni in ordine di efficienza. Tutti prendono in una lista di numeri tra 0 e 1. L’elenco può essere piuttosto lungo., Un esempio di elenco di input sarebbe . Come dimostreresti che la tua risposta è corretta?
Risposta
Più a meno efficiente:f2
,f1
,f3
. Per dimostrare che questo è il caso, vorresti profilare il tuo codice. Python ha un bel pacchetto di profilazione che dovrebbe fare il trucco.
import cProfilelIn = cProfile.run('f1(lIn)')cProfile.run('f2(lIn)')cProfile.run('f3(lIn)')
Per il completamento, ecco cosa produce il profilo precedente:
Perché preoccuparsi?
Localizzare ed evitare i colli di bottiglia è spesso piuttosto utile., Un sacco di codifica per l’efficienza si riduce al buon senso – nell’esempio sopra è ovviamente più veloce ordinare un elenco se si tratta di un elenco più piccolo, quindi se si ha la scelta di filtrare prima di un ordinamento è spesso una buona idea. Le cose meno ovvie possono ancora essere localizzate attraverso l’uso degli strumenti appropriati. È bello sapere di questi strumenti.
Domanda 14
Qualcosa che hai fallito?
Risposta sbagliata
Non fallisco mai!
Perché questo è importante:
Mostra che sei in grado di ammettere errori, assumerti la responsabilità dei tuoi errori e imparare dai tuoi errori., Tutte queste cose sono maledettamente importante se avete intenzione di essere utile. Se siete in realtà perfetto poi troppo male, potrebbe essere necessario per ottenere creativo qui.
Domanda 15
Hai qualche progetto personale?
Davvero?
Questo dimostra che sei disposto a fare più del minimo indispensabile in termini di mantenere aggiornato il tuo skillset. Se lavori su progetti personali e codice al di fuori del posto di lavoro, i datori di lavoro hanno maggiori probabilità di vederti come una risorsa che crescerà. Anche se non fanno questa domanda trovo che sia utile affrontare l’argomento.,
Conclusione
Queste domande hanno intenzionalmente toccato molti argomenti. E le risposte erano volutamente prolisse. In un’intervista di programmazione, dovrai dimostrare la tua comprensione e se puoi farlo in modo conciso, allora con tutti i mezzi fallo. Ho cercato di dare abbastanza informazioni nelle risposte che si potrebbe raccogliere qualche significato da loro, anche se non aveva mai sentito parlare di alcuni di questi argomenti prima. Spero che lo trovi utile nella tua caccia al lavoro.
Vai a prenderli tiger.