Dois-je apprendre Python 2 ou Python 3 ? 24


J’ai écris cet artice en 2012. La réponse a depuis changé :

Apprenez Python 3.

Il est plus simple, plus élégant, plus mieux.

Installez minimum Python 3.4, si possible.

Quelques exceptions à cette règle :

  • Vous planifier d’utiliser une lib en rouge dans cette liste.
  • Vous savez que vous allez bosser essentiellement sur du vieux code dans votre boîte.

Rappelez-vous qu’il est facile d’installer et utiliser Python 2 et 3 sur la même machine. Et un virtualenv peut contenir une version de Python particulière. Le choix de l’un n’exclus donc pas l’autre pour plus tard. On peut même écrire un code qui marche sur Python 2 ET Python 3 aujourd’hui. C’est moche, mais ça marche :)

Donc, bonjour Python 3 avec pip et venv installés par défaut, les accents qui marchent out of the box, pas de bizarreries qui traînent comme des noms incohérents et object

Mac et Linux ont la 2.7 par défaut installé, mais ça se règle avec un coup de homebrew, apt-get install, yum install, etc. N’ayez pas peur.

Mon ancien article n’est donc plus valable.

Les deux versions étant incompatibles, et Python 3 ayant plein de super fonctionnalités que Python 2 n’a pas, mais la V2 étant encore très répandue, on peut se demander lequel on doit apprendre.

Etat du lard

Python 3 permet de s’affranchir de beaucoup de problèmes d’encoding en utilisant unicode par défaut. A partir de la version 3.3, il va venir avec un virtualenv intégré, et distutils2, rendant le packaging et le déploiement beaucoup plus simple. Sans compter la délégation à un sous générateur. Plus besoin non plus d’utiliser ‘object’ dans l’héritage, et des tas de libs nettoyées. Bref, un comportement plus simple et un langage plus beau.

Python 2 lui est néanmoins présent encore partout:

  • Ubuntu est toujours en 2.7, et passera en 3 dans la prochaine version, mais laissant la possibilité d’installer la 2.
  • Mac OS utilise toujours la 2.6 par défaut.
  • Certains serveurs Web sont toujours en 2.4 (!) si bien que Max recompile carrément Python 2.6 dessus (oui, c’est un acharné).
  • Django est en phase de transition version Python 3, mais pour le moment ce n’est pas fait, et il sera toujours compatible avec Python 2.7 pour les deux prochaines versions.
  • Une bonne partie des libs sur pypi et sur github sont toujours en Python 2, ou au moins compatibles avec.

Enfin, l’outil 2to3 permet de convertir automatiquement, et facilement, la plupart des codes de Python 2 vers Python 3.

Apprentissage et usage

Dans la vie de tous les jours, en tant que programmeur Python, vous allez donc forcément être confronté à Python 2 pendant encore 3 ou 4 ans. Je rappelle que Python 2.4 était encore assez courant il y a deux ans, et qu’il y a 5 ans je lisais encore des questions sur les fora concernant Python 2.2.

Or, Python 2 est plus compliqué que Python 3, il demande des connaissances particulières: gérer l’encoding, setuper son virtualenv, faire gaffe à bien utiliser ‘object’, connaitre les noms des libs mal standardisés, etc.

Dans tous les cas, il sera toujours beaucoup plus simple d’apprendre Python 2 et de passer à Python 3 que l’inverse, et il est improbable que vous n’ayez pas besoin de toucher un code en Python 2. Hey, nous même, nous codons encore tous nos projets en Python 2. On se posera la question de la migration quand Django l’aura fait, et même là, on aura des tas de projets qui resteront pour toujours en V2.

Donc, si vous apprenez (ou enseignez le Python), le choix le plus pragmatique est d’apprendre avec Python 2, et de rajouter l’apprentissage des différences entre la V2 et la V3. Ce faisant vous saurez aussi comment faire migrer un projet, ce dont il est possible que vous ayez un jour besoin.

24 thoughts on “Dois-je apprendre Python 2 ou Python 3 ?

  • Laurent

    Honnêtement pour le moment c’est ce qui freine mon apprentissage de python.
    Quand j’ai eu à faire un choix j’ai commencé avec python 3 (mauvais départ) mais je me suis bien rendu compte que j’allais être limité que ce soit pour faire du django ou pour certaines lib qui sont pour beaucoup encore en 2.x.
    Aujourd’hui j’ai vraiment envie de me replonger dedans, surtout en lisant vos articles qui réveillent en moi une passion brûlante pour python, mais ça me fait grave chier de passer par du 2.

  • Soli

    Typo : « possible possible »

    Sur le fond, pour apprendre python [et l’utiliser immédiatement], je suis d’accord que 2.7 reste sans doute plus utile en pratique, mais pour enseigner, non, je pense que 3.3 est plus facile, plus élégant (pour les raisons énoncées au début de cet article) et sera rapidement la solution naturelle…

  • Sam Post author

    @Soli: en tant que formateur, j’essaye toujours de trouver une compromis entre facile et utile. Python étant quand même super facile à apprendre, je pense que commencer par la V2 est un bon équilibre.

    @Laurent: ouai je comprends. Ca me ferait chier aussi à ta place. C’est pareil pour les frameworks. Quand j’ai du passer de Django 0.9 à Django 1. Relou…

  • GM

    Typo :
    – si bien que Max on recompile carrément
    – il sera toujours plus beaucoup plus simple

    Moi, vu que j’ai appris en 2.3/2.4, j’avoue que je n’ai pas fait l’effort de regarder la 3, pour ces raisons de lib encore en v2. Et pourtant les changelog font envie.

  • Laurent

    @sam wé mais quand tu passes de Django 0.9 à Django 1 tu évolues. Perso en passant de python 3 à python 2.7 j’ai l’impression de régresser.

  • Christophe Simonis

    Petits joueurs. Moi j’ai commencé avec python 1.5.2 :o

  • Guillaume Duval

    L’idéal en ce qui concerne la découverte de Python serait un tutoriel sur la version 2.6/2.7 qui intégrerait le maximum d’éléments de la version 3. Il n’y a aucune raison de ne pas apprendre la méthode format() des strings au lieu de l’opérateur % … bon mais j’avoue que j’utilise encore mes vieux caleçons et l’instruction print plutôt que la fonction. En dessous de la version 2.7, utiliser ‘{}’.format(‘truc’) sans rien ça pose des problèmes, par exemple avec Alwaysdata qui est à la version 2.6.6 … vivement qu’on passe à la version 3 et je pourrais presque avoir autant de classe américaine que Christophe en disant « Moi j’ai commencé avec python 2.6 » !

  • Sam Post author

    Ouai, d’autant que c’est tellement plus rapide d’écrire:

    print "%s" % truc

    que:

    print('{}'.format(truc))

    Scrameustache Powa !

  • JeromeJ

    Ayant dût travailler avec des Python 2 (pas le choix), ce que j’ai fais et que je conseille est, le plus souvent possible, déjà prendre les bonnes habitudes Python 3 grâce au module future.

    Car perso une fois que je suis passé à Python 3, plus trop envie de faire du 2 même si pour ma part je trouve qu’il n’y a pas tant de changement que ça.

    2to3 est quant à lui certes pratique mais ne fonctionne pas pour tout malheureusement et/ou il ne change pas le code de la façon dont il aurait été meilleur de le concevoir en Python3 mais par exemple convertit certains générateurs (Python3) de nouveau en liste car il ignore la façon dont vous utilisiez votre liste (alors que parfois un générateur aurait été bien mieux).

    Et perso je trouve le old-style format pour les strings moche et chiant, je préfère le nouveau :D (mais bon ça c’est du trolling)

  • Sam Post author

    Oui d’ailleurs rien que:

    from __future__ import unicode_literals

    Vaut la peine d’être utilisé.

  • tshirtman

    Je fais toujours uniquement du 2.7, faudra que je tente le 3, mais ça me demandrais de pousser pour une migration du framework sur lequel je bosse (kivy), et c’est un sacré boulot, donc on procrastine ça un peu…

    au passage: on dit forums, pas fora, les mots étrangers importés en français s’accordent à la française (idem pour scénarios, pas scenarii)
    wikipedia pluriels français des mots d’origine étrangère, sauf cas spécifiques dans les sciences.
    (ou a minima, si tu garde fora, il faut le mettre en italique, ce n’est pas un mot français).

    Cordialement.

  • Sam Post author

    Et pourtant, on dit bien un “medium”, des “media”. C’est une exception ou un abus de langage ?

  • muchos

    @Sam: On dit “un média / des médias.” (source: Le Robert 2008)

    Je pense que médium pour média (et les déclinaisons évoquées par tshirtman) sont des abus de langage, très influencés par le wiktionnaire.

  • RedRaiden

    Ave !

    (En fait, on peut dire “fora” ou “scenarii” pour frimer. C’est autorisé d’après ce que j’ai compris. Pour media, il me semble que c’est parce que les gens ont arrété d’utiliser le cerveau et que ce qui était une erreur est devenu la norme – comme “au temps pour moi” devenu “autant pour moi”…)


    Je vais commencer par Python 2, merci pour l’article.

  • Yuz

    Petit déterrage de post ;)

    Je vais commencer à coder du python et je voulais savoir si c’était toujours d’actualité ou si le python 3 était plus approprié aujourd”hui … en 2015

    Sinon merci pour ce site et pour le ton sur lequel les sujets sont traités.

  • Sam Post author

    Va falloir que je réécrive ce post car maintenant, on peut dans 99% des cas partir sur Python 3.

  • kayl

    Bonjour,

    La question est-t-elle toujours d’actualité ?

    Je voudrais apprendre Python. Dois-je commencer par la v2 ?

  • cendrieR

    Pour ma part je dois bosser avec du 2.6 (ne me demandez pas pourquoi), à la maison j’ai un peu la flemme de schizophréner sur du 3, je reste sur de la 2.7.

    Mais le jour ou je me motiverai à bien intégrer les virtualenv (avec l’article qui va bien de ce merveilleux site), je me lancerai dans le futur sans arrière-pensée.

  • CUEIRB22

    Merci d’avoir mis à jour ce topic

    j’hésitais encore à installer la 2.7 ou la 3.4 !

  • daimebag

    Pour infos, maintenant sur la version 16.04 d’Ubuntu(désolé je ne sais pas ce que ça donne sur les autres distri), c’est python 3.5 qui est installé par défaut.

Leave a comment

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.