Chemin de progression Python - De l'apprenti au gourou


659

Cela fait maintenant un an et demi que j'apprends, travaille et joue avec Python. En tant que biologiste se tournant lentement vers la bio-informatique, cette langue a été au cœur de toutes les contributions majeures que j'ai apportées au laboratoire. Je suis plus ou moins tombé amoureux de la façon dont Python me permet d'exprimer de belles solutions et aussi de la sémantique du langage qui permet un flux si naturel des pensées au code exploitable.

Ce que j'aimerais savoir, c'est votre réponse à une sorte de question que j'ai rarement vue sur ce forum ou sur d'autres. Cette question me semble centrale pour toute personne sur la voie de l'amélioration de Python, mais qui se demande quelles devraient être ses prochaines étapes.

Permettez-moi de résumer ce que je ne veux PAS demander en premier;)

  • Je ne veux pas savoir apprendre RAPIDEMENT Python
  • Je ne veux pas non plus découvrir la meilleure façon de se familiariser avec la langue
  • Enfin, je ne veux pas connaître l'approche «une astuce qui fait tout».

Ce que je veux savoir sur votre opinion, c'est:

Quelles sont les étapes que VOUS recommanderiez à un compagnon Python, de l'apprentissage au statut de gourou (n'hésitez pas à vous arrêter là où votre expertise le dicte), afin que l'on AMÉLIORE CONSTAMMENT, devenant un meilleur codeur Python, une étape à la fois. Certaines personnes sur SO semblent presque dignes d'adoration pour leurs prouesses en Python, veuillez nous éclairer :)

Le genre de réponses que j'apprécierais (mais n'hésitez pas à surprendre le lectorat: P), est plus ou moins formaté comme ceci:

  • Lisez ceci (par exemple: tutoriel python), faites attention à ce genre de détails
  • Code pour tant de fois / problèmes / lignes de code
  • Ensuite, lisez ceci (par exemple: tel ou tel livre), mais cette fois, faites attention à ce
  • S'attaquer à quelques problèmes réels
  • Passez ensuite à la lecture de Y.
  • Assurez-vous de bien comprendre ces concepts
  • Code pour l'heure X
  • Revenez à telle ou telle base ou avancez vers ...
  • (tu obtiens le point :)

Je tiens vraiment à connaître votre opinion sur ce à quoi il convient de prêter attention, à différentes étapes, afin de progresser CONSTAMMENT (avec les efforts nécessaires, bien sûr). Si vous venez d'un domaine d'expertise spécifique, discutez de la voie que vous voyez appropriée dans ce domaine.

EDIT: Grâce à votre excellente contribution, je suis de retour sur la piste d'amélioration de Python! J'apprécie beaucoup!

Réponses:


471

Je pensais que le processus de maîtrise de Python allait quelque chose comme:

  1. Découvrez les listes de compréhension
  2. Découvrez les générateurs
  3. Incorporez souvent la carte, réduisez, filtrez, itérez, étendez, xrangez dans votre code
  4. Découvrez les décorateurs
  5. Écrire des fonctions récursives, beaucoup
  6. Découvrez itertools et functools
  7. Lire Real World Haskell ( lire gratuitement en ligne )
  8. Réécrivez tout votre ancien code Python avec des tonnes de fonctions d'ordre supérieur, de récursivité et ainsi de suite.
  9. Ennuyez vos compagnons de cabine chaque fois qu'ils vous présentent une classe Python. Affirmez qu'il pourrait être «mieux» implémenté en tant que dictionnaire plus certaines fonctions. Adoptez la programmation fonctionnelle.
  10. Redécouvrez le modèle de stratégie , puis toutes ces choses du code impératif que vous avez tant essayé d'oublier après Haskell.
  11. Trouvez un équilibre.

@wheaties Super belle liste, j'adore! Vous semblez avoir un penchant pour la programmation fonctionnelle et s'éloigner de l'orientation objet ... y a-t-il une raison particulière? L'expérience Haskell vous a-t-elle redirigé vers cette approche?
Morlock

8
Oui et non. Je trouve que j'écris du code meilleur et plus concis à mesure que je me rapproche de la programmation fonctionnelle. Cela dit, il y a beaucoup d'endroits où les choses s'expriment plus clairement de manière impérative. Il y a une raison pour laquelle Real World Haskell est vendu aux conventions Python, cela fait de vous un meilleur programmeur. Mon conseil, explorez autant de facettes de Python que possible, puis essayez un langage fonctionnel.
fromages

@wheaties obtient la réponse car elle est à la fois plus proche du format demandé et très inspirante. Merci d'avoir pris le temps de répondre!
Morlock

1
Débutants: Dictionnaire puis plus tard ... Maîtrise: Métaprogrammation
gath

Pourriez-vous développer >> il pourrait être "mieux" implémenté sous forme de dictionnaire et de certaines fonctions. <<?
Koobz

108

Un bon moyen d'approfondir vos connaissances sur Python consiste à fouiller dans le code source des bibliothèques, plates-formes et frameworks que vous utilisez déjà.

Par exemple, si vous créez un site sur Django , vous pouvez répondre à de nombreuses questions susceptibles de vous tromper en regardant comment Django implémente la fonctionnalité en question.

De cette façon, vous continuerez à choisir de nouveaux idiomes, styles de codage et astuces Python . (Certains seront bons et d'autres mauvais.)

Et lorsque vous voyez quelque chose de Pythony que vous ne comprenez pas dans la source, passez au canal IRC #python et vous trouverez de nombreux "juristes du langage" heureux de vous expliquer.

Une accumulation de ces petites clarifications au fil des ans conduit à une compréhension beaucoup plus profonde de la langue et de tous ses tenants et aboutissants.


1
J'ajouterais à cela qu'au lieu d'installer simplement une extension / plugin django, essayez d'ajouter le code manuellement en utilisant une branche git. Cela vous obligera à lire réellement le code que vous ajoutez au projet.
g33kz0r

14
Suis curieux pourquoi utiliser IRC alors que le reste d'entre nous pourrait bénéficier de la question?
tshepang

1
+1 pour "idiomes, styles et astuces". Vivre une vraie CULTURE faite par de vraies personnes en contact (même si ce contact signifie surtout lire le code de l'autre dans ce cas) est ce qui a fait évoluer la connaissance humaine au fil du temps.
heltonbiker

92

Comprendre (plus en profondeur) les types de données de Python et leurs rôles en ce qui concerne la gestion de la mémoire

Comme certains d'entre vous le savent, j'enseigne des cours Python , les plus populaires étant le cours complet Intro + Intermédiaire ainsi qu'un cours "avancé" qui présente une variété de domaines de développement d'applications.

Très souvent, on me pose une question assez similaire à: "Dois-je suivre votre cours d'introduction ou avancé? Je programme déjà Python depuis 1-2 ans et je pense que celui-ci est trop simple pour moi, donc je souhaitez passer directement à l'avancé ... quel cours recommanderiez- vous ? "

Pour répondre à leur question, je sonde pour voir à quel point ils sont forts dans ce domaine - non pas que ce soit vraiment la meilleure façon de mesurer s'ils sont prêts pour un cours avancé, mais pour voir à quel point leurs connaissances de base sont des objets de Python et modèle de mémoire, qui est à l'origine de nombreux bogues Python écrits par ceux qui ne sont pas seulement des débutants mais aussi ceux qui sont allés au-delà.

Pour ce faire, je les pointe vers cette simple question en 2 parties: Ex1: x = 42;  y = x;  x + = 1;  imprimer x, y Ex2: x = [1,2,3]; y = x; x [0] = 4; imprimer x, y

Plusieurs fois, ils sont capables d'obtenir la sortie, mais le pourquoi est plus difficile et beaucoup plus important d'une réponse ... Je peserais la sortie comme 20% de la réponse tandis que le "pourquoi" obtient 80% de crédit. S'ils ne peuvent pas comprendre le pourquoi, quelle que soit leur expérience Python, je guiderai toujours les gens vers le cours d'introduction + intermédiaire complet parce que je passe une conférence sur les objets et la gestion de la mémoire au point où vous devriez pouvoir répondre avec le sortie et le pourquoi avec une confiance suffisante. (Ce n'est pas parce que vous connaissez la syntaxe de Python après 1-2 ans que vous êtes prêt à aller au-delà d'une étiquette "débutant" jusqu'à ce que vous ayez une bien meilleure compréhension de la façon dont Python fonctionne sous les couvertures.)

Une enquête ultérieure nécessitant une réponse similaire est encore plus difficile, par exemple,

Exemple 3

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

Les sujets suivants que je recommande sont de bien comprendre le comptage des références, d'apprendre ce que signifie "interner" (mais pas nécessairement de l'utiliser), de se renseigner sur les copies superficielles et profondes (comme dans l'exemple 3 ci-dessus), et enfin, les interrelations entre les différents types et constructions dans le langage, c.-à-d. listes vs tuples, dicts vs sets, list comprehensions vs expressions générateur, itérateurs vs générateurs, etc .; mais toutes ces autres suggestions sont un autre article pour une autre fois. J'espère que cela vous aidera en attendant! :-)

ps. Je suis d'accord avec les autres réponses pour devenir plus intime avec l'introspection ainsi que pour étudier le code source d'autres projets et ajouter un fort "+1" aux deux suggestions!

pps. Grande question BTW. J'aimerais être assez intelligent au début pour avoir demandé quelque chose comme ça, mais c'était il y a longtemps, et maintenant j'essaie d'aider les autres avec mes nombreuses années de programmation Python à plein temps !!


Wesley Chun! Morlock, c'est le genre de gars dont vous parliez dans la partie en gras de votre question. Un gars très bien informé qui était aussi un professeur très doué, j'ai reçu un énorme coup de pouce du livre.
démonté le

thx @bvmou! Je n'ai pu répondre à cette question que parce que je devais suivre ce processus d'apprentissage comme tout le monde ... seule la mienne était il y a 13 ans! :-) thx pour brancher corepython.com tho! :-)
wescpy

@wescpy Pouvez-vous m'expliquer la sortie de example3 ou me diriger vers une bonne ressource pour apprendre ce truc.Merci.
Sankalp

1
L'astuce est que seules les références d'objets sont copiées, pas les objets eux-mêmes. C'est tout ce qu'il y a à faire ... j'espère que ça aide! J'ai donné une conférence à ce sujet il y a quelques semaines à OSCON. J'ai été agréablement surpris lorsque quelqu'un m'a dit que c'était le discours Python le mieux noté lors de la conférence! Vous pouvez télécharger les diapositives ici: oscon.com/oscon2013/public/schedule/detail/29374
wescpy

La sortie est SyntaxError: syntaxe invalide, n'est-ce pas? Pourquoi? Parce que j'ai utilisé Python 3, et ce printn'est pas une déclaration.
Konrad Borowski


59

Comprendre l'introspection

  • écrire un dir()équivalent
  • écrire un type()équivalent
  • comprendre comment "patch singe"
  • Utilisez le dis module pour voir comment fonctionnent les différentes constructions de langage

Faire ces choses

  • vous donner de bonnes connaissances théoriques sur la façon dont python est implémenté
  • vous donner une bonne expérience pratique de la programmation de niveau inférieur
  • vous donne une bonne sensation intuitive pour les structures de données python

1
"Écrivez un type()équivalent" qui serait très difficile si vous prenez la spécification métaclassique complète de type!
asmeurer

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 () devrait être réussi. rien ne peut décrire le gourou, laissez-le passer
inv

1
Si vous corrigez le GIL, je pense que cela vous place à un niveau PLUS HAUT que le gourou, mais juste en dessous du dictateur bienveillant. ;)
Adam Parkin

41

Je vais vous donner le conseil le plus simple et le plus efficace, je pense que n'importe qui pourrait vous donner: du code .

Vous ne pouvez être meilleur dans l'utilisation d'un langage (ce qui implique de le comprendre) qu'en codant . Vous devez apprécier activement le codage, être inspiré, poser des questions et trouver des réponses par vous-même.

Vous avez une heure à perdre? Écrivez du code qui inversera une chaîne et découvrez la solution la plus optimale. Une soirée libre? Pourquoi ne pas essayer le web-scraping. Lisez le code des autres peuples. Voyez comment ils font les choses. Demandez-vous ce que vous feriez.

Quand je m'ennuie devant mon ordinateur, j'ouvre mon IDE et mon code-storm. Je note des idées qui semblent intéressantes et stimulantes. Un raccourcisseur d'URL? Bien sûr, je peux le faire. Oh, j'ai appris à convertir des nombres d'une base à une autre comme effet secondaire!

Ceci est valable quel que soit votre niveau de compétence. Vous n'arrêtez jamais d'apprendre. En codant activement pendant votre temps libre, vous comprendrez la langue et, en fin de compte, deviendrez un gourou. Vous accumulerez des connaissances et du code réutilisable et mémoriserez des idiomes.


24

Si vous utilisez et utilisez python pour la science (ce qui semble être le cas), cela consistera à apprendre et à comprendre les bibliothèques scientifiques, pour moi, ce serait

  • engourdi
  • scipy
  • matplotlib
  • mayavi / mlab
  • chaco
  • Cython

savoir utiliser les bonnes bibliothèques et vectoriser votre code est essentiel pour le calcul scientifique.

Je voulais ajouter que la gestion de grands ensembles de données numériques de manière pythonique courante (approches orientées objet, listes, itérateurs) peut être extrêmement inefficace. Dans le calcul scientifique, il peut être nécessaire de structurer votre code de manière radicalement différente de la façon dont la plupart des codeurs python conventionnels abordent les données.


Merci. Il vaut certainement la peine de prendre le temps d'apprendre numpy et scipy pour gagner en efficacité dans l'utilisation de la mémoire pour les grands ensembles de données!
Morlock

1
Ajoutez probablement des pandas et IPython à la liste.
Eric Wilson



12

Comprendre parfaitement tous les types de données et structures

Pour chaque type et structure, écrivez une série de programmes de démonstration qui exercent tous les aspects du type ou de la structure de données. Si vous faites cela, il pourrait être utile de bloguer des notes sur chacun d'eux ... cela pourrait être utile à beaucoup de gens!


Cela serait non seulement utile en Python, mais aussi dans un sens abstrait.
Humphrey Bogart

1
C'est quelque chose que je fais aussi, chaque fois que je trouve une nouvelle construction, j'écris un programme de jouets montrant comment l'utiliser. Et mettez-le en ligne dans un dépôt
Adam Parkin

10

J'ai d'abord appris le python par moi-même pendant un été juste en faisant le tutoriel sur le site python (malheureusement, je ne semble plus pouvoir le trouver, donc je ne peux pas poster de lien).

Plus tard, le python m'a été enseigné dans l'un de mes cours de première année à l'université. L'été qui a suivi, j'ai pratiqué avec PythonChallenge et avec des problèmes de Google Code Jam . La résolution de ces problèmes aide d'un point de vue algorithmique ainsi que du point de vue de l'apprentissage de ce que Python peut faire ainsi que de la façon de le manipuler pour tirer le meilleur parti de python.

Pour des raisons similaires, j'ai entendu dire que le golf de code fonctionne également, mais je ne l'ai jamais essayé par moi-même.


3
Vous voulez dire ce tutoriel? Python 2: docs.python.org/tutorial/index.html ; Python 3: docs.python.org/py3k/tutorial/index.html .
Humphrey Bogart

10

Algorithmes d'apprentissage / mathématiques / IO de fichiers / optimisation Pythonic

Cela ne vous obtiendra pas de gourou, mais pour commencer, essayez de résoudre les problèmes du projet Euler. Les 50 premières ou plus ne devraient pas vous imposer si vous avez des mathématiques décentes au secondaire et savez comment Google. Lorsque vous en résolvez un, vous accédez au forum où vous pouvez parcourir les solutions d'autres personnes qui vous en apprendront encore plus. Soyez décent cependant et ne publiez pas vos solutions car l'idée est d'encourager les gens à les résoudre eux-mêmes.

Vous forcer à travailler en Python sera impitoyable si vous utilisez des algorithmes de force brute. Cela vous apprendra à disposer de grands ensembles de données en mémoire et à y accéder efficacement avec les fonctionnalités linguistiques rapides telles que les dictionnaires.

En faisant cela moi-même, j'ai appris:

  • Fichier IO
  • Algorithmes et techniques tels que la programmation dynamique
  • Disposition des données Python
    • Dictionnaires / hashmaps
    • Listes
    • Tuples
    • Diverses combinaisons de ceux-ci, p.ex. dictionnaires de listes de tuples
  • Générateurs
  • Fonctions récursives
  • Développement de bibliothèques Python
    • Disposition du système de fichiers
    • Les recharger lors d'une session d'interprète

Et aussi très important

  • Quand abandonner et utiliser C ou C ++!

Tout cela devrait être pertinent pour la bioinformatique

Certes, je n'ai pas appris les fonctionnalités OOP de Python à partir de cette expérience.


3
J'aime le site PE, mais soyons honnêtes: c'est un site de mathématiques, pas un site de programmation. La plupart des problèmes (ou du moins la plupart de ceux que j'ai faits) se résument vraiment à la connaissance de quelques astuces mathématiques par rapport à tout ce qui concerne le langage de programmation. Souvent, les bonnes solutions dans les forums sont noyées par les vagues de solutions naïves, etc.
Adam Parkin

Au contraire, j'ai trouvé que cela impliquait l'application de la programmation et des compétences en mathématiques et, surtout, la combinaison des deux pour résoudre de vrais problèmes. Vous ne pouvez pas utiliser PE pour apprendre la programmation Python si vous avez de faibles compétences en mathématiques, mais vous allez seulement apprendre à utiliser un langage en l'utilisant, donc c'est idéal si vos mathématiques sont assez bonnes.
Capitaine Lepton

7

Avez-vous vu le livre " Programmation bioinformatique utilisant Python "? On dirait que vous êtes un membre exact de son groupe de discussion.


2
Après avoir parcouru rapidement le livre il y a quelque temps, j'ai trouvé que ce livre n'était pas très intéressant. Il s'adresse aux utilisateurs Python très novices et les problèmes eux-mêmes ne sont pas extrêmement intéressants. Dommage, c'est clairement un domaine où l'utilisation de Python augmente. Un livre plus stimulant aurait été formidable.
Morlock

6

Vous avez déjà beaucoup de matériel de lecture, mais si vous pouvez en gérer plus, je vous recommande de vous renseigner sur l'évolution de python en lisant les propositions d'amélioration de Python, en particulier les PEP "finis" et les "différés, abandonnés, retirés et rejetés". PPE.

En voyant comment le langage a changé, les décisions qui ont été prises et leurs justifications, vous absorberez la philosophie de Python et comprendrez comment le "Python idiomatique" se produit.

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



3

Enseigner à quelqu'un d'autre qui commence à apprendre le Python est toujours un excellent moyen de clarifier vos idées et parfois, j'ai souvent beaucoup de questions intéressantes de la part des étudiants qui m'ont amené à repenser les choses conceptuelles sur Python.


2

Pas précisément ce que vous demandez, mais je pense que c'est un bon conseil.

Apprendre une autre langue, peu importe laquelle. Chaque langue a ses propres idées et conventions que vous pouvez apprendre. Découvrez les différences dans les langues et, plus important encore, whyelles sont différentes. Essayez un langage purement fonctionnel comme Haskell et voyez certains des avantages (et défis) des fonctions sans effets secondaires. Découvrez comment appliquer à Python certaines des choses que vous apprenez d'autres langues.


1
Haskell est intrigant et je suis attiré par Lisp, mais je pense qu'il y a encore beaucoup à découvrir dans le monde Python avant de vouloir continuer.
Morlock

2
landoflisp (.com) a récemment attiré mon attention.
Jiaaro

Si quelqu'un pense à Lisp, je recommande Scheme
Tharindu Rusira

2

Je recommande de commencer par quelque chose qui vous oblige à explorer le pouvoir expressif de la syntaxe. Python permet de nombreuses façons différentes d'écrire la même fonctionnalité, mais il existe souvent une approche unique la plus élégante et la plus rapide. Si vous êtes habitué aux idiomes d'autres langues, vous ne pourriez jamais autrement trouver ou accepter ces meilleures façons. J'ai passé un week-end à parcourir les 20 premiers problèmes de Project Euler et à faire une simple webapp avec Django sur Google App Engine. Cela ne vous mènera peut-être que d'apprenti à novice, mais vous pourrez ensuite continuer à créer des applications Web un peu plus avancées et à résoudre des problèmes de Project Euler plus avancés. Après quelques mois, je suis revenu et j'ai résolu les 20 premiers problèmes d'EP à partir de zéro en une heure au lieu d'un week-end.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.