2010-09-22 8 views
4

J'ai été un apprenant passionné de la langue Python depuis un certain temps. Ayant plus de 6 ans d'expérience Java [professionnelle], couplée à un peu d'expérience C++ [hobby] - il est juste de dire que ma perspective est profondément ancrée dans les idiomes mis en avant par ces langues fortement typées et fortement liées. En bref, je peux dire que la façon de penser de la vieille école a une influence importante sur mon style de programmation.l'apprentissage de python - point à garder à l'esprit w.r.t idiomes!

Ma raison de choisir Python, et non de dire Ruby, était avant tout une coïncidence puisque j'ai pu travailler à temps partiel avec Python. ça fait 2 semaines, et les choses n'ont été qu'une révolution! armé w/IDLE et le Python Essential Reference, il a été une révélation après l'autre. c'est comme si un physicien classique se sentait si la gravité cessait d'exister!

Quoi qu'il en soit, je comprends que pour être efficace avec python il va falloir du temps pour un travail concret. Plus que la syntaxe, je pense que c'est à cause de la façon dont mon esprit pense. cependant, préparé autant que je suis, il y a une chose particulière qui me dérange un peu - Python offre beaucoup trop d'idiomes pour effectuer la même chose. Par exemple, lister la compréhension et filtrer (...), appliquer (...) et eval (...), etc. alors que ces idiomes ne sont pas complètement substituables, mais je trouve que leurs objectifs principaux se chevauchent dans une large mesure . Je comprends qu'il doit y avoir des gains de performance sous-jacents vis-à-vis de leurs usages. Cependant, en tant que débutant, quelle est la meilleure façon de suivre l'éducation et de réduire la distraction de «n» façons de résoudre la même chose?

+1

Leçon n ° 0: N'utilisez pas 'eval' dans le code de production :). – MAK

Répondre

4

compréhension de la liste et le filtre (...), appliquer (...) et eval (...), etc., tandis que ces idiomes ne sont pas complètement substituable, mais je trouve que leur principaux objectifs se chevauchent dans une large mesure

La façon pythonique serait: une utilisation simple pour les boucles ou compréhensions de liste. filter et map sont des restes d'anciennes versions de la langue. Guido voulait les supprimer à un moment donné, mais il s'est avéré qu'il y avait des cas d'utilisation valides et assez de gens qui aimeraient qu'ils restent (voir aussi this thread). N'utilisez pas eval.Ne vous inquiétez pas des performances à moins que cela ne devienne un problème (et dans ce cas le moyen le plus simple - essayer d'utiliser les fonctions hautement optimisées dans la bibliothèque standard - est le meilleur moyen la plupart du temps).

Je pense qu'en général Python est vraiment simple à essayer de fournir une façon (évidente) de faire les choses, bien que des variations valides (plus ou moins) se produisent et les opinions sur certains sujets diffèrent bien sûr.

Récupérer les idiomes de Python peut être aussi simple que de naviguer sur ce site et d'accorder une attention particulière aux réponses fortement mises à jour sur les questions Python (la plupart du temps il y a un consensus sur la meilleure façon de faire).

1

Désolé, si ma réponse est pas aussi longtemps que votre question, mais, de toute façon, va ici:

tout d'abord à propos listcomps/filtre/appliquer/eval. Si vous êtes sur le point d'utiliser le filtre ou l'application, il vaut mieux utiliser une compréhension de liste (ou une expression de générateur) ou une boucle for, - filtrer, mapper, réduire et appliquer sont, fondamentalement, des atavismes autant que je sache et peuvent être ignoré en toute sécurité. Eval n'a rien à voir avec l'un ou l'autre de ces éléments, il évalue juste une chaîne comme du code python. Vous ne devriez probablement pas l'utiliser, sauf si vous avez une très bonne raison de le faire (indice: vous n'avez pas). Problèmes: bien, pour la plupart, en python, pour un problème donné, il existe une «façon de faire» optimale, qui devrait être utilisée pour 99% des cas similaires. Exemples: besoin d'analyser/transformer/générer xml? Utilisez lxml. Besoin de faire du réseautage/à peu près tout autre type d'E/S? Utilisez twisted. Etc. Bien sûr, il existe des alternatives, mais la plupart du temps il y a effectivement une façon optimale de faire les choses. Ceci est d'autant plus pertinent si vous travaillez simplement avec la bibliothèque standard, car elle fournit beaucoup de solutions optimales aux problèmes courants (bien qu'elle contienne des éléments plutôt inutiles).

0

drôle que vous dire ceci: « ça a été une révélation après l'autre, il est comme la façon dont un physicien classique se sentirait si la gravité a cessé d'exister.! »: http://xkcd.com/353/

+2

Pas downvoting, mais aurait été plus approprié comme un commentaire imho ... – ChristopheD

+0

ouais - mais une coïncidence en effet! :] – anirvan

+0

Je trouve amusant que le hello-world dans cette bande dessinée ne soit plus valide Python, mais toujours valide Ruby. – Ken

2

type

import this 

en IDLE

3

Puisque vous venez d'un milieu Java, je recommande la lecture Python is not Java. Sans parler de la plupart des autres articles dans la barre latérale. L'article donne de bons conseils sur la façon dont les programmeurs Java peuvent involontairement utiliser Python (et comment ne pas le faire).

+0

Bel article. Chacun de ces conseils s'applique également à Java. Les trucs fonctionnent toujours, ils prennent juste un peu plus de temps à implémenter en Java qu'en Python, mais ils sont tous possibles et tout va améliorer votre code (à l'exception de mettre des données dans votre code - je pense que les DSL implémentés dans de manière à permettre à votre langage de les compiler conduit à une syntaxe terrifiante et stupide, il suffit de créer un REAL DSL et de l'analyser, les données devraient être extraites du code complètement, pas seulement avec une syntaxe stupide! –

+0

merci pour l'article donne vraiment le ton de ce à quoi s'attendre et, plus important encore, comment digérer les choses par rapport à l'usage pratique. – anirvan

Questions connexes