web-dev-qa-db-fra.com

Comment puis-je apprendre à écrire efficacement du code Pythonic?

Faire une recherche google pour "Pythonic" révèle un large éventail d'interprétations. La page wikipedia dit:

Un néologisme courant dans la communauté Python est Pythonic, qui peut avoir un large éventail de significations liées au style de programme. Dire que le code est Pythonic revient à dire qu'il utilise Python idiomes bien, qu'il est naturel ou montre la maîtrise de la langue. De même, dire d'une interface ou d'une fonctionnalité de langage qu'il est Pythonic, c'est dire qu'il fonctionne bien avec Python idiomes, que son utilisation cadre bien avec le reste de la langue.

Il traite également du terme "non-pythonique":

En revanche, une marque de code non pythonique est qu'il tente d'écrire du code C++ (ou LISP, Perl ou Java) en Python, c'est-à-dire qu'il fournit une transcription approximative plutôt qu'une traduction idiomatique de formulaires d'un autre langage. Le concept de pythonicité est étroitement lié à la philosophie minimaliste de lisibilité de Python et évite l'approche "il y a plus d'une façon de le faire". Le code illisible ou les idiomes incompréhensibles sont impythoniques.

Que signifie le terme "Pythonic"? Comment puis-je apprendre à l'appliquer efficacement dans la pratique?

46
user39685

J'ai découvert que la plupart des gens ont leurs propres interprétations de ce que signifie réellement "Pythonic". De Wikipédia:

Un néologisme courant dans la communauté Python est Pythonic, qui peut avoir un large éventail de significations liées au style de programme. Dire que le code est Pythonic revient à dire qu'il utilise Python idiomes bien, qu'il est naturel ou montre la maîtrise de la langue. De même, dire d'une interface ou d'une fonctionnalité de langage qu'il est Pythonic, c'est dire qu'il fonctionne bien avec Python idiomes, que son utilisation cadre bien avec le reste de la langue.

En revanche, une marque de code non pythonique est qu'il tente d'écrire du code C++ (ou LISP, Perl ou Java) en Python, c'est-à-dire qu'il fournit une transcription approximative plutôt qu'une traduction idiomatique de formulaires d'un autre langage. Le concept de pythonicité est étroitement lié à la philosophie minimaliste de lisibilité de Python et évite l'approche "il y a plus d'une façon de le faire". Le code illisible ou les idiomes incompréhensibles sont impythoniques.

J'ai constaté que plus souvent qu'autrement, plus d'exemples "Pythonic" sont en fait dérivés de personnes essayant d'être intelligentes avec les idiomes Python et (encore une fois, plus souvent qu'autrement), rendant leur code virtuellement illisible (ce qui est pas Pythonic).

Tant que vous vous en tenez aux idiomes de Python et évitez d'essayer d'utiliser des styles C++ (ou autre langage) en Python, alors vous êtes Pythonic.

Comme l'a souligné WorldEngineer, PEP8 est un bon standard à suivre (et si vous utilisez VIM, il existe des plugins disponibles pour le linting PEP8).


Vraiment cependant, au bout du compte, si votre solution fonctionne et n'est pas absolument horriblement irréalisable et lente, qui s'en soucie? Plus souvent qu'autrement, votre travail consiste à accomplir une tâche, pas à écrire le code Pythonic le plus élégant possible.


Une autre note latérale (juste mon avis, n'hésitez pas à voter à cause de cela;)): J'ai également trouvé la communauté Python à remplir avec un tonne d'ego (pas que la plupart des communautés ne le soient pas , c'est juste un peu plus répandu dans des communautés comme C et Python). Ainsi, la combinaison de l'ego avec des interprétations erronées du fait d'être "Pythonique" aura tendance à produire beaucoup de négativité sans fondement. Prenez ce que vous lisez des autres avec un grain de sel. Respectez les normes et la documentation officielles et vous aurez être bien.

22
Demian Brecht

Pythonic consiste à coder idiomatiquement en Python. Cela signifie utiliser des structures et un formatage qui fonctionnent bien pour Python du point de vue de la programmation mais aussi du point de vue de la lecture communautaire. Cela ressemble beaucoup à la façon dont K&R a défini la norme pour le style de programmation C pendant longtemps. Ce guide montre que vous devez coder idiomatiquement en Python. PEP 8 est référencé dans ce guide, donc il vaut probablement la peine d'être lu.

17
World Engineer

L'écriture de code "Pythonic" à mon humble avis fait simplement une utilisation efficace des fonctionnalités (V) HLL fournies par le langage. À titre d'exemple omniprésent,

x, y = 7, 'fuhrer'

C'est très Pythonic. Je me souviens quand j'ai commencé à apprendre le C # après des mois de Python,

int x, y = 10, z;

en quelque sorte m'a confondu, mais il m'a fallu une minute pour revenir à mes racines C/C++.

Une autre façon Pythonique utilise les lambdas.

l = [1, 2, 3, 4, 5]
print(sorted(l, key=lambda x: -x))

affichera en fait l trié par ordre décroissant.

Ensuite, il y a le "typage du canard" très utilisé, mais très moins compris - s'il marche et parle comme un canard, vous le traitez comme un canard. Ceci est vaguement lié aux interfaces dans d'autres OO langues).

L'utilisation de méthodes de programmation fonctionnelles le cas échéant, telles que l'utilisation de map et de réduction, est également considérée comme Pythonic.

J'ai vu une réponse affichée pendant que je tapais, et elle contient un lien agréable. PS: Ce n'est pas que votre connaissance de Python est limitée. Je peux parier que Python n'était pas votre première langue, et donc, (comme la plupart d'entre nous les pythonistes) ) vous devrez apprendre à devenir "idiomatique" avec le serpent!

13
yati sagade
--> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Le code Pythonic est:

  • Lisible
  • Simple (aussi simple que possible, mais pas plus simple)
  • Bien pensé
7
Ethan Furman

Chaque fois que j'ai essayé d'apprendre une nouvelle langue, j'ai trouvé que lire du code par des gens qui connaissent la langue comme le fond de leur main, regarder/poser des questions sur tout ce qui semble bizarre, puis essayer d'imiter leur style est le meilleure chose à faire. Exemples:

En Python, puisque nous sommes sur le sujet, j'ai trouvé les exemples de Dive Into Python incroyablement utiles pour commencer. Ils ont tendance à enseigner non seulement les bases de Python, mais à vraiment mettre l'accent sur idiomatique Python.

Lors de l'apprentissage de D, puisque la documentation n'était pas excellente à l'époque parce que le langage saignait tellement Edge, j'ai appris en lisant le code dans la bibliothèque standard, en particulier, certains chefs-d'œuvre d'Andrei Alexandresc .

Lors de l'apprentissage du C++, j'ai hérité d'une base de code d'un assez bon programmeur C++ et j'ai beaucoup appris sur la programmation C++ idiomatique grâce à son insistance à passer des conteneurs STL par référence, etc.

Dans toutes les langues, je trouve utile de parcourir les questions de StackOverflow sur la langue et de voir ce que les gens font généralement pour accomplir les choses de base.

6
dsimcha

Python n'est pas Java pourrait vous donner des conseils utiles. Je ne peux pas en dire plus sans savoir quel genre de problèmes vous rencontrez, mais c'est un conseil très concret pour les programmeurs venant d'un autre langage (en l'occurrence spécifiquement Java) sur la façon de faire python différemment .

3
maxpolun

Quelqu'un a dit de paraphraser, pour apprendre ce qui est Pythonic, il suffit de dénicher du code. Je suis en désaccord avec cela. Si vous aimez écrire du code très dense, cela ne le rend pas plus Pythonic.

Une façon de vous aider à définir ce qui est Pythonic en ce qui vous concerne, demandez-vous "Pourquoi devrais-je (c'est-à-dire vous) utiliser le langage Python?") Qu'est-ce qui vous plaît?

Pour moi, c'est la lisibilité et le manque de compilation et open source (à peu près tout). Je peux télécharger des tonnes de bibliothèques et lire leur code source avec moins de stress sur les licences que de nombreuses autres langues.

Pour moi Python est beau visuellement. Guido (le créateur de Python) continue également de me prouver, à travers ses réponses dans PEPS et ses discussions) que ses choix pour la façon dont il a fait le langage sont supérieurs à mes propres idées sur la façon dont il aurait dû être créé.

Pour moi, un grand programmeur est quelqu'un avec des compétences de prise de décision très éclairées sur la voie à suivre lors du codage. Pour moi, Python aide à faire ces choix rapidement.

En simplifiant la syntaxe du code source en autorisant la frappe de canard au lieu de transtypage de type explicide, et l'attente que les codeurs examinant votre code "devraient être des codeurs bien comportés" mène à quelque chose que j'appelle aussi "Pythonic"

Il y a donc deux côtés de ce qui est Pythonic. L'un est syntaxique, l'autre est la pratique de. Comment expliquer le côté profond de ce qui est "Pythonic" ..?

En Python ce n'est pas grave de le faire: alist = ['one', 'two', 'three\n'] alist.append ((1234, 'Atuple'))

et le Tuple sera ajouté à la liste sans se soucier des types d'objets. La partie Pythonic n'est pas que vous POUVEZ faire cela, mais que votre code devrait ATTENDRE cela et simplement fonctionner/s'adapter.

Tout ce qui fonctionne sur l'objet -alist- devrait être écrit avec l'idée qu'un autre codeur pourrait entrer et ajouter une non-chaîne à la liste et que l'adaptation du code source par le nouveau codeur ne devrait pas être difficile à faire. C'est l'avantage de ducktype après tout.

2
DevPlayer