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


46

Effectuer une recherche google sur "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 du programme. Dire que le code est pythonique, c'est dire qu'il utilise bien les idiomes de Python, qu'il est naturel ou qu'il parle couramment le langage. De même, dire d'une interface ou d'un langage qu'il est pythonique, c'est dire que cela fonctionne bien avec les idiomes Python, que son utilisation s'imbrique bien avec le reste du langage.

Il aborde également le terme "unpythonic":

En revanche, une marque de code non polythonique 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 que la 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". Un code illisible ou des idiomes incompréhensibles sont impythoniques.

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


6
Je pense que votre question peut être étendue à n’importe quel langage de programmation. Il existe toujours une méthode de programmation recommandée qui peut être précise dans un grand nombre de cas et également pour améliorer la révision, la lisibilité et la maintenance. Je pense aussi que remettre en question ces recommandations peut faire évoluer et évoluer un langage ...
Amine

@ Amine si vrai. En fait, je pense qu'un wiki de communauté consistant précisément à savoir où apprendre les idiomes de langue - pour toutes les langues - devrait être envisagé.
Yati Sagade


1
Commentaires: veuillez cesser de publier des commentaires non pertinents. ils ont été supprimés pour une raison. Si vous avez une réponse, laissez-la comme une réponse. Si vous souhaitez discuter du sujet de cette question, veuillez utiliser le chat .

1
En pratiquant Python!
Dynamique

Réponses:


22

J'ai constaté que la plupart des gens ont leur propre interprétation de ce que signifie "Pythonic". De Wikipedia:

Un néologisme courant dans la communauté Python est Pythonic, qui peut avoir un large éventail de significations liées au style du programme. Dire que le code est pythonique, c'est dire qu'il utilise bien les idiomes de Python, qu'il est naturel ou qu'il parle couramment le langage. De même, dire d'une interface ou d'un langage qu'il est pythonique, c'est dire que cela fonctionne bien avec les idiomes Python, que son utilisation s'imbrique bien avec le reste du langage.

En revanche, une marque de code non polythonique 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 que la 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". Un code illisible ou des idiomes incompréhensibles sont impythoniques.

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

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

Comme l’a souligné WorldEngineer, PEP8 est un bon standard à suivre (et si vous utilisez VIM, des plug-ins sont disponibles pour les filtres PEP8).


Vraiment cependant, à la fin de la journée, si votre solution fonctionne et si elle n'est pas absolument horriblement impossibles à maintenir et lente, qui s'en soucie? Plus souvent qu'autrement, votre travail consiste à exécuter une tâche et non à écrire le code le plus élégant et pythonique possible.


Une autre note latérale (juste mon opinion, n'hésitez pas à voter à cause de ça;)): J'ai aussi trouvé que la communauté Python était remplie d'une tonne d'ego (pas que la plupart des communautés ne le soient pas , c'est un peu plus répandu dans des communautés telles que C et Python). Ainsi, la combinaison de l'ego avec des interprétations mal interprété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. Tenez-vous-en aux normes officielles et à la documentation et tout ira bien.


2
+1 pour une bonne réponse (sauf pour la citation puisque je l'ai utilisée dans l'OP).

Ugh .. Devrait relire le PO avant de poster la citation: P
Demian Brecht

3
Il existe plutôt une forte corrélation entre l'ego et le fait d'être actif en ligne, exprimant des opinions dans n'importe quelle communauté. Fondamentalement, vous ne voyez pas beaucoup les gens non-égoïstes parce qu'ils n'écrivent pas beaucoup en premier lieu.
Isarandi

17

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 également du point de vue de la lecture par la communauté. Cela ressemble beaucoup à la façon dont K & R a établi la norme pour le style de programmation C pendant longtemps. Ce guide montre que vous devez coder de manière idiomatique en Python. PEP 8 est référencé dans ce guide et mérite donc d'être lu.


1
@ MattFenwick N'est-ce pas 90% de la programmation? Les bons programmeurs passent beaucoup de temps à lire le code et écrivent beaucoup de temps. Plus vous lisez de code Pythonic et plus vous écrivez en Python, plus votre code sera Pythonic. Je ne pense pas qu'il y ait de raccourci ici.
Kris Harper

2
Excellent lien!
Ethan Furman

13

Écrire du code "Pythonic" à mon humble avis utilise simplement les fonctionnalités (V) HLL fournies par le langage. Comme exemple omniprésent,

x, y = 7, 'fuhrer'

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

int x, y = 10, z;

m'a un peu dérouté, mais il m'a fallu une minute pour revenir à mes racines C / C ++.

Une autre façon pythonique utilise lambdas.

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

imprimera effectivement ltrié par ordre décroissant.

Ensuite, il y a le "typage de 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 langages OO.

Les méthodes de programmation fonctionnelles, telles que l'utilisation de map et de réduire, sont également considérées comme pythoniques.

J'ai vu une réponse être postée pendant que je tapais, et elle contient un bon lien. PS: Ce n'est pas que votre connaissance de Python soit limitée. Je parie que le python n'était pas votre langue maternelle et que par conséquent (comme la plupart d'entre nous, les pythonistes), vous devrez apprendre à être "idiomatiques" avec le serpent! À votre santé!


Je n'ai pas inclus le lien car il était déjà affiché au moment de taper - réponse de WorldEngineer :) Pensez simplement à "exploiter" les fonctionnalités du langage pour votre bien et celui des autres, et vous obtiendrez Pythonic en route, et veuillez suivre. ce lien
yati sagade

4
En fait, de nombreux conflits qui map, reduce, lambdaet ce sont idiomatiques en soi. La compréhension de liste et l'expression de générateur sont une alternative et beaucoup les préfèrent chaque fois que cela est raisonnablement possible (en particulier, ils sont moins bruyants lorsque vous auriez besoin d'un lambda de toute façon). Ils ont certainement leur utilité, et la programmation fonctionnelle montre d’autres idiomes (décorateur par exemple).

@delnan est d'accord - et encore plus en ce qui concerne Python 3. La conclusion est que les fonctionnalités doivent être utilisées exactement là où cela est nécessaire. Et cela (il n'y a qu'une façon évidente de le faire) est idiomatique :)
yati sagade

Personnellement, je n'ai jamais compris les préférences des gens pour votre premier exemple. C'est beaucoup plus facile à analyser mentalement (ce qui est le zen de Python, le code est lu plus souvent qu'il n'est écrit): (x, y) = (7, 'fuhrer')- pourtant, je suis presque toujours "corrigé": sans parens, c'est le meilleur moyen de l'écrire!
Izkata

2
Je dirais que votre exemple de tri spécifique n’est pas pythonique. Pourquoi réintroduire le réordonnancement avec un lambda si vous le pouvez print(sorted(l, reverse=True)), ce qui indique également explicitement au lecteur ce qui se passe. Je trouverais également votre premier exemple discutable. Ce sont deux missions compressées en une seule; ça va, mais je n'appellerais pas ça très Pythonic. Les lecteurs doivent regarder plus longtemps ce qu'il fait que par rapport à deux assignations.
phresnel

7
--> 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 pythonique est:

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

1
+1 Le zen de Python est plus important pour l'écriture de code pythonique que de suivre une liste d'idiomes; ce dernier ne couvrira pas toutes les circonstances.
Doval

6

Chaque fois que j'essayais d'apprendre une nouvelle langue, je trouvais ce code lu par des personnes qui la connaissaient parfaitement, qui levait les yeux / posait des questions sur tout ce qui avait l'air bizarre, puis essayant d'imiter leur style. meilleure chose à faire. Exemples:

En Python, étant donné que nous sommes sur le sujet, j’ai trouvé les exemples de Dive Into Python extrêmement utiles pour commencer. Ils ont tendance à enseigner non seulement les bases de Python, mais également à mettre l'accent sur Python idiomatique .

Lors de l’apprentissage de D, la documentation n’étant pas excellente à l’époque, à cause de la langue utilisée, j’ai appris en lisant le code dans la bibliothèque standard, en particulier certains des chefs-d’œuvre d’ Andrei Alexandrescu .

En apprenant le C ++, j’ai hérité du code d’un très bon programmeur C ++ et j’ai beaucoup appris sur la programmation idiomatique C ++ de son insistance à faire passer les conteneurs STL par référence, etc.

Dans toutes les langues, je trouve qu'il est utile de parcourir les questions de StackOverflow sur la langue et de voir ce que les gens font généralement pour accomplir des tâches de base.


+1 Une fois que vous connaissez les bases d'une langue, la lecture de code aidera beaucoup plus que la lecture de livres.
Pace

3

Python n'est pas Java peut 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'une autre langue (en l'occurrence java), expliquant comment faire du python différemment.


2

Quelqu'un a dit de paraphraser, pour savoir ce qu'est Pythonic, il suffit de lancer du code. Je ne suis pas d'accord avec ça. Si vous aimez écrire du code très dense, cela ne le rend pas plus pythonique.

Une façon de vous aider à définir ce qu'est Pythonic en ce qui vous concerne est de vous demander: "Pourquoi utiliserais-je le langage Python?" Qu'est-ce qui vous attire à ce sujet?

Pour moi, c’est la lisibilité et le manque de compilation et d’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 que d’autres licences.

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

Pour moi, un bon programmeur est une personne possédant des compétences décisionnelles très éclairées sur la voie à suivre lors de la programmation. Pour moi, Python aide à faire ces choix rapidement.

En simplifiant la syntaxe du code source en autorisant la saisie de type de canard au lieu du transtypage de type explicid, et l'attente selon laquelle les codeurs révisant votre code "devraient être bien codés" conduit à quelque chose que j'appelle aussi "Pythonic"

Donc, il y a 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 qu'est "Pythonic" ..?

Cela n’est pas très grave: alist = ['one', 'two', 'three \ n'] alist.append ((1234, 'Atuple'))

et le tuple sera ajouté à la liste sans se soucier des types d'objet. La partie Pythonic n’est pas que vous POUVEZ faire cela, mais que votre code doit ATTENDRE cela et juste travailler / s’adapter.

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


-2

Achetez un livre recommandé. Lis le. Cela devrait vous donner une bonne base pour utiliser la langue et un mécanisme qui devrait correspondre au style de la communauté.

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.