Percorso di progressione di Python - Dall'apprendista al guru


659

Ho imparato, lavorato e suonato con Python per un anno e mezzo ormai. Come biologo che sta lentamente avviando la bioinformatica, questa lingua è stata al centro di tutti i principali contributi che ho apportato in laboratorio. Mi sono più o meno innamorato del modo in cui Python mi permette di esprimere soluzioni meravigliose e anche della semantica del linguaggio che permette un flusso così naturale dai pensieri al codice praticabile.

Quello che vorrei sapere è la tua risposta a un tipo di domanda che ho visto raramente in questo o in altri forum. Questa domanda mi sembra centrale per chiunque sia sulla strada del miglioramento di Python ma chi si chiede quali dovrebbero essere i suoi prossimi passi.

Consentitemi di riassumere ciò che NON voglio prima chiedere;)

  • Non voglio sapere come imparare rapidamente Python
  • Né voglio scoprire il modo migliore per conoscere la lingua
  • Infine, non voglio conoscere un approccio "un trucco che faccia tutto".

Quello di cui voglio sapere la tua opinione è:

Quali sono i passaggi che consiglieresti a un giornalista di Python, dall'apprendistato allo status di guru (sentiti libero di fermarti dove la tua esperienza lo impone), affinché uno MIGLIORA COSTANTE, diventando un programmatore Python sempre migliore, un passo alla volta. Alcune persone su SO sembrano quasi degne di adorazione per la loro abilità in Python, per favore illuminaci :)

Il tipo di risposte che mi piacerebbe (ma sentiti libero di sorprendere i lettori: P), è formattato più o meno in questo modo:

  • Leggi questo (ad esempio: tutorial su Python), presta attenzione a quel tipo di dettagli
  • Codice per così tante volte / problemi / righe di codice
  • Quindi, leggi questo (ad es. Questo o quel libro), ma questa volta presta attenzione a questo
  • Affronta alcuni problemi della vita reale
  • Quindi, continua a leggere Y.
  • Assicurati di cogliere questi concetti
  • Codice per X volte
  • Torna a queste e queste nozioni di base o vai oltre a ...
  • (ottieni il punto :)

Mi interessa davvero conoscere la tua opinione su cosa esattamente si dovrebbe prestare attenzione, in varie fasi, al fine di progredire COSTANTE (con i dovuti sforzi, ovviamente). Se provieni da un settore specifico di competenza, discuti il ​​percorso che ritieni appropriato in questo campo.

EDIT: Grazie al tuo fantastico input, sono tornato sulla traccia di miglioramento di Python! Ho davvero apprezzato!

Risposte:


471

Pensavo che il processo di padronanza di Python fosse simile a:

  1. Scopri le comprensioni dell'elenco
  2. Scopri i generatori
  3. Incorporare spesso la mappa, ridurre, filtrare, iter, range, xrange nel codice
  4. Scopri i decoratori
  5. Scrivi molte funzioni ricorsive
  6. Scopri itertools e functools
  7. Leggi Real World Haskell ( leggi online gratuitamente )
  8. Riscrivi tutto il tuo vecchio codice Python con tonnellate di funzioni di ordine superiore, ricorsione e quant'altro.
  9. Infastidisci i tuoi compagni di box ogni volta che ti presentano una classe Python. Affermare che potrebbe essere "meglio" implementato come dizionario oltre ad alcune funzioni. Abbraccia la programmazione funzionale.
  10. Riscopri il modello di strategia e poi tutte quelle cose dal codice imperativo che hai provato così duramente a dimenticare dopo Haskell.
  11. Trova un equilibrio.

@wheaties Super bella lista, lo adoro! Sembri avere una propensione alla programmazione funzionale e lontano dall'orientamento agli oggetti ... c'è un motivo particolare? L'esperienza di Haskell ti ha reindirizzato verso questo approccio?
Morlock,

8
Sì e no. Trovo che scrivo codice migliore e più conciso più mi avvicino alla programmazione funzionale. Detto questo, ci sono molti luoghi in cui le cose sono espresse più chiaramente in modo imperativo. C'è un motivo per cui Real World Haskell è esaurito alle convenzioni di Python, il che ti rende un programmatore migliore. Il mio consiglio, esplora quante più sfaccettature di Python possibile, quindi prova un linguaggio funzionale.
wheaties

@wheaties ottiene la risposta poiché è sia il più vicino al formato richiesto sia molto stimolante. Grazie per il tempo dedicato a rispondere!
Morlock,

1
Principianti: Dizionario poi in seguito ... Mastery: Metaprogrammazione
gath

Potresti approfondire >> potrebbe essere "meglio" implementato come dizionario più alcune funzioni. <<?
Koobz,

108

Un buon modo per approfondire le tue conoscenze su Python è quello di scavare nel codice sorgente delle librerie, delle piattaforme e dei framework che usi già.

Ad esempio, se stai costruendo un sito su Django , puoi rispondere a molte domande che potrebbero sconcertarti osservando come Django implementa la funzione in questione.

In questo modo continuerai a raccogliere nuovi modi di dire, stili di codifica e trucchi Python . (Alcuni andranno bene e altri andranno male.)

E quando vedi qualcosa di Pythony che non capisci nella fonte, passa al canale IRC #python e troverai molti "avvocati linguisti" felici di spiegare.

Un accumulo di questi piccoli chiarimenti nel corso degli anni porta a una comprensione molto più profonda della lingua e di tutti i suoi dettagli.


1
Aggiungo a questo che invece di installare semplicemente un'estensione / plugin django, prova ad aggiungere manualmente il codice usando un ramo git. Questo ti costringerà a leggere effettivamente il codice che stai aggiungendo al progetto.
g33kz0r

14
Sono curioso di sapere perché usare IRC quando il resto di noi potrebbe beneficiare della domanda?
Tshepang,

1
+1 per "modi di dire, stili e trucchi". Vivere una vera CULTURA fatta da persone reali in contatto (anche se questo contatto significa principalmente leggere il codice reciproco in questo caso) è ciò che ha mai fatto evolvere la conoscenza umana nel tempo.
heltonbiker,

92

Comprendi (più in profondità) i tipi di dati di Python e i loro ruoli riguardo alla memoria mgmt

Come alcuni di voi nella comunità sanno, insegno ai corsi Python , i più popolari sono il corso completo Intro + Intermedio e un corso "avanzato" che introduce una varietà di aree di sviluppo delle applicazioni.

Molto spesso, mi viene posta una domanda del tutto simile a "Dovrei seguire la tua introduzione o corso avanzato? Sto già programmando Python da 1-2 anni, e penso che quella di introduzione sia troppo semplice per me, quindi vorrei come per passare direttamente alla avanzato ... che ovviamente sarebbe si consiglia?"

Per rispondere alla loro domanda, sondaggio per vedere quanto sono forti in quest'area - non che sia davvero il modo migliore per misurare se sono pronti per qualsiasi corso avanzato, ma per vedere quanto bene sono le loro conoscenze di base sugli oggetti di Python e modello di memoria, che è la causa di molti bug di Python scritti da coloro che non sono solo principianti ma anche coloro che sono andati oltre.

Per fare ciò, li indico a questa semplice domanda a quiz in 2 parti: Ex1: x = 42;  y = x;  x + = 1;  stampa x, y Ex2: x = [1,2,3]; y = x; x [0] = 4; stampa x, y

Molte volte, sono in grado di ottenere l'output, ma il perché è più difficile e molto più importante di una risposta ... Peserei l'output come 20% della risposta mentre il "perché" ottenga un credito dell'80%. Se non riescono a capire il perché, indipendentemente dall'esperienza di Python, guiderò sempre le persone al corso completo introduttivo + intermedio perché passo una lezione sugli oggetti e la gestione della memoria al punto in cui dovresti essere in grado di rispondere con il output e il perché con sufficiente fiducia. (Solo perché conosci la sintassi di Python dopo 1-2 anni non ti rende pronto ad andare oltre un'etichetta "principiante" fino a quando non avrai una comprensione molto migliore di come Python funziona sotto le copertine.)

Un'indagine successiva che richiede una risposta simile è ancora più dura, ad es.

Esempio 3

x = ['foo', [1,2,3], 10.4]
y = list(x) # or x[:]
y[0] = 'fooooooo'
y[1][0] = 4
print x
print y

I prossimi argomenti che consiglio sono di comprendere bene il conteggio dei riferimenti, apprendere cosa significa "internare" (ma non necessariamente usarlo), apprendere copie superficiali e profonde (come nell'esempio 3 sopra) e infine le interrelazioni tra i vari tipi e costruisce nella lingua, cioè liste contro tuple, dicts contro insiemi, comprensione delle liste contro espressioni del generatore, iteratori contro generatori, ecc .; tuttavia tutti questi altri suggerimenti sono un altro post per un'altra volta. Spero che questo aiuti nel frattempo! :-)

ps. Concordo con le altre risposte per essere più intimo con l'introspezione e per studiare il codice sorgente di altri progetti e aggiungere un forte "+1" a entrambi i suggerimenti!

pps. Grande domanda BTW. Vorrei essere abbastanza intelligente all'inizio per aver chiesto una cosa del genere, ma è stato tanto tempo fa, e ora sto cercando di aiutare gli altri con i miei molti anni di programmazione Python a tempo pieno !!


Wesley Chun! Morlock, questo è il tipo di ragazzo di cui parlavi nella parte in grassetto della tua domanda. Un ragazzo profondamente informato che è anche un insegnante molto dotato, ho avuto un enorme impulso dal libro.
smontato il

grazie @bvmou! ho potuto rispondere a questa domanda solo perché dovevo passare attraverso questo processo di apprendimento come tutti gli altri ... solo il mio era 13 anni fa! :-) grazie per aver collegato corepython.com tho! :-)
wescpy

@wescpy Puoi spiegarmi l'output di example3 o indicarmi una buona risorsa per imparare queste cose. Grazie.
Sankalp,

1
Il trucco è che vengono copiati solo i riferimenti agli oggetti, non gli oggetti stessi. Questo è tutto quello che c'è da fare ... spero che aiuti! Ne ho parlato a poche settimane fa, all'OSCON. Sono stato piacevolmente sorpreso quando qualcuno mi ha detto che era la conferenza Python più votata alla conferenza! Puoi scaricare le diapositive qui: oscon.com/oscon2013/public/schedule/detail/29374
wescpy

L'output è SyntaxError: sintassi non valida, no? Perché? Perché ho usato Python 3 e printnon è un'affermazione.
Konrad Borowski,


59

Comprendi l'introspezione

  • scrivere un dir()equivalente
  • scrivere un type()equivalente
  • capire come "patch-scimmia"
  • usa il dismodulo per vedere come funzionano i vari costrutti del linguaggio

Fare queste cose lo farà

  • darti alcune buone conoscenze teoriche su come viene implementato Python
  • darti una buona esperienza pratica nella programmazione di livello inferiore
  • ti dà una buona sensazione intuitiva per le strutture dati di Python

1
"Scrivi un type()equivalente" che sarebbe molto difficile se prendessi tutte le specifiche di metaclassia di type!
asmeurer il

48
def apprentice():
  read(diveintopython)
  experiment(interpreter)
  read(python_tutorial)
  experiment(interpreter, modules/files)
  watch(pycon)

def master():
  refer(python-essential-reference)
  refer(PEPs/language reference)
  experiment()
  read(good_python_code) # Eg. twisted, other libraries
  write(basic_library)   # reinvent wheel and compare to existing wheels
  if have_interesting_ideas:
     give_talk(pycon)

def guru():
  pass # Not qualified to comment. Fix the GIL perhaps?

4
guru () dovrebbe essere pass. nulla può descrivere il guru, lascialo passare
inv

1
Se aggiusti il ​​GIL, penso che ti porti ad un livello SUPERIORE rispetto al guru, ma appena al di sotto del dittatore benevolo. ;)
Adam Parkin

41

Ti darò il consiglio più semplice ed efficace che penso che qualcuno possa darti: codice .

Puoi solo essere migliore nell'usare una lingua (che implica comprenderla) di codifica . Devi goderti attivamente la programmazione, essere ispirato, porre domande e trovare risposte da solo.

Hai un'ora da perdere? Scrivi il codice che inverte una stringa e scopri la soluzione ottimale. Una serata libera? Perché non provare un po 'di web scraping. Leggi il codice di altre persone. Guarda come fanno le cose. Chiediti cosa faresti.

Quando sono annoiato dal mio computer, apro il mio IDE e la mia tempesta di codice. Annoto idee che sembrano interessanti e stimolanti. Un accorciatore di URL? Certo, posso farlo. Oh, ho imparato a convertire i numeri da una base all'altra come effetto collaterale!

Questo è valido qualunque sia il tuo livello di abilità. Non smetti mai di imparare. Codificando attivamente nel tuo tempo libero, arriverai a comprendere la lingua e alla fine diventerai un guru. Svilupperai conoscenza e codice riutilizzabile e memorizzerai modi di dire.


24

Se ti trovi e usi Python per la scienza (cosa che sembra che tu sia) parte dell'apprendimento e della comprensione delle biblioteche scientifiche, per me queste sarebbero

  • numpy
  • SciPy
  • matplotlib
  • Mayavi / MLAB
  • chaco
  • Cython

saper usare le librerie giuste e vettorializzare il tuo codice è essenziale per il calcolo scientifico.

Volevo aggiungere che, gestire grandi set di dati numerici in modi pitonici comuni (approcci orientati agli oggetti, elenchi, iteratori) può essere estremamente inefficiente. Nel calcolo scientifico, può essere necessario strutturare il codice in modo che differisca drasticamente dal modo in cui i programmatori di pitone più convenzionali si avvicinano ai dati.


Grazie. Vale sicuramente la pena prendersi del tempo per imparare intorpidimento e scipy per ottenere efficienza nell'uso della memoria per grandi set di dati!
Morlock,

1
Probabilmente aggiungi panda e IPython all'elenco.
Eric Wilson,



12

Comprendere a fondo tutti i tipi e le strutture di dati

Per ogni tipo e struttura, scrivi una serie di programmi dimostrativi che esercitano ogni aspetto del tipo o della struttura dei dati. Se lo fai, potrebbe valere la pena di scrivere blog su ognuno di essi ... potrebbe essere utile a molte persone!


Questo non sarebbe utile solo in Python, ma anche in senso astratto.
Humphrey Bogart,

1
Questo è qualcosa che faccio anche ogni volta che trovo un nuovo costrutto scrivo un programma giocattolo che mostra come usarlo. E mettilo online in un repository github: github.com/pzelnip/MiscPython
Adam Parkin

10

Ho imparato Python da solo durante l'estate semplicemente facendo il tutorial sul sito Python (purtroppo, non riesco più a trovarlo, quindi non posso pubblicare un link).

Più tardi, il pitone mi fu insegnato in uno dei miei corsi del primo anno all'università. Nell'estate che seguì, mi esercitavo con PythonChallenge e con problemi da Google Code Jam . Risolvere questi problemi aiuta da una prospettiva algoritmica e dalla prospettiva di imparare cosa può fare Python e come manipolarlo per ottenere il massimo da Python.

Per ragioni simili, ho sentito che funziona anche il code golf , ma non l'ho mai provato da solo.



10

Algoritmi di apprendimento / matematica / file IO / ottimizzazione Pythonic

Questo non ti farà impazzire, ma per iniziare, prova a risolvere i problemi del Project Euler I primi 50 o giù di lì non dovrebbero farti pagare se hai una buona matematica delle superiori e sai come Google. Quando ne risolvi uno entri nel forum dove puoi consultare le soluzioni di altre persone che ti insegneranno ancora di più. Sii discreto e non pubblicare le tue soluzioni poiché l'idea è di incoraggiare le persone a risolverle da sole.

Forzarti a lavorare in Python non perdonerà se usi algoritmi a forza bruta. Questo ti insegnerà come disporre grandi set di dati in memoria e accedervi in ​​modo efficiente con le funzioni linguistiche veloci come i dizionari.

Da questo ho imparato da solo:

  • File IO
  • Algoritmi e tecniche come la programmazione dinamica
  • Layout dei dati Python
    • Dizionari / HashMaps
    • elenchi
    • Le tuple
    • Varie combinazioni di ciò, ad esempio dizionari per elenchi di tuple
  • generatori
  • Funzioni ricorsive
  • Sviluppo di librerie Python
    • Layout del filesystem
    • Ricaricarli durante una sessione di interprete

E anche molto importante

  • Quando rinunciare e usare C o C ++!

Tutto ciò dovrebbe essere rilevante per la bioinformatica

Devo ammettere che non ho imparato a conoscere le funzionalità OOP di Python da quell'esperienza.


3
Mi piace il sito PE, ma siamo onesti: è un sito di matematica, non un sito di programmazione. La maggior parte dei problemi (o almeno la maggior parte di quelli che ho fatto) si riduce a conoscere alcuni trucchi matematici rispetto a qualsiasi altro linguaggio di programmazione. Spesso le buone soluzioni nei forum vengono soffocate dalle ondate di soluzioni ingenue, ecc.
Adam Parkin

Al contrario, ho scoperto che comportava sia l'applicazione di competenze di programmazione che quelle matematiche e, soprattutto, la combinazione dei due per risolvere problemi reali. Non puoi usare PE per imparare la programmazione Python se hai scarse abilità matematiche ma imparerai solo come usare una lingua usandola, quindi è l'ideale se la tua matematica è abbastanza buona.
Capitano Lepton

7

Hai visto il libro " Programmazione bioinformatica usando Python "? Sembra che tu sia un membro esatto del suo focus group.


2
Dopo aver esaminato rapidamente il libro qualche tempo fa, ho scoperto che questo libro non è molto interessante. È rivolto a utenti Python molto alle prime armi e i problemi stessi non sono estremamente interessanti. Peccato, questa è chiaramente un'area in cui l'uso di Python è in aumento. Un libro più stimolante sarebbe stato grandioso.
Morlock,

6

Hai già molto materiale di lettura, ma se riesci a gestirne di più, ti consiglio di conoscere l'evoluzione di Python leggendo le Proposte di potenziamento di Python, in particolare i PEP "finiti" e i "Differiti, abbandonati, ritirati e rifiutati" PEP.

Vedendo come è cambiato il linguaggio, le decisioni che sono state prese e le loro motivazioni, assorbirai la filosofia di Python e capirai come nasce il "Python idiomatico".

http://www.python.org/dev/peps/



3

Insegnare a qualcun altro che sta iniziando a imparare Python è sempre un ottimo modo per rendere chiare le tue idee e, a volte, di solito ricevo molte domande chiare dagli studenti che mi fanno riflettere su cose concettuali su Python.


2

Non proprio quello che stai chiedendo, ma penso che sia un buon consiglio.

Impara un'altra lingua, non importa troppo quale. Ogni lingua ha le sue idee e convenzioni da cui puoi imparare. Scopri le differenze nelle lingue e, cosa più importante why, sono diverse. Prova un linguaggio puramente funzionale come Haskell e scopri alcuni dei vantaggi (e delle sfide) delle funzioni prive di effetti collaterali. Scopri come applicare ad Python alcune delle cose che impari da altre lingue.


1
Haskell è intrigante e sono attratto da Lisp, ma sento che c'è ancora molto da scoprire nel mondo di Python prima di voler andare avanti.
Morlock

2
landoflisp (.com) ha recentemente attirato la mia attenzione.
Jiaaro,

Se qualcuno sta pensando a Lisp, consiglio Scheme
Tharindu Rusira il

2

Consiglio di iniziare con qualcosa che ti costringe a esplorare il potere espressivo della sintassi. Python offre molti modi diversi di scrivere la stessa funzionalità, ma spesso esiste un approccio più elegante e veloce. Se sei abituato ai modi di dire di altre lingue, non potresti mai trovare o accettare questi modi migliori. Ho trascorso un fine settimana a ripercorrere i primi 20 problemi di Project Euler e ho realizzato una semplice webapp con Django su Google App Engine. Questo ti porterà solo da apprendista a principiante, forse, ma puoi quindi continuare a creare webapps un po 'più avanzate e risolvere problemi di Project Euler più avanzati. Dopo alcuni mesi sono tornato indietro e ho risolto da zero i primi 20 problemi di PE in un'ora anziché un fine settimana.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.