Java dev learning Python: de quels concepts ai-je besoin pour bien me comprendre?

38

Contexte: J'ai parcouru quelques tutoriels et écrit de petits projets. Tout se passe assez bien avec Google et StackOverflow .

Plusieurs fois au cours des derniers jours, je me suis demandé "qu'est-ce qui me manque?" - Je pense que je pense toujours en Java alors que j'écris en Python.

Cette question de StackOverflow contient de nombreux conseils sur les ressources à lire pour apprendre Python, mais je pense toujours que je suis un développeur Java doté d'un dictionnaire (sans jeu de mots) à traduire en Python.

Ce que je veux vraiment faire, c'est de refactoriser ma tête pour pouvoir écrire Pythonic Python au lieu de Java déguisé en Python, sans perdre mes compétences en Java.

Donc, le noeud de ma question est: quels concepts un développeur Java a-t-il réellement besoin d'apprendre à penser à Pythonic? Cela inclut tout ce qui doit être désappris.

Remarque: je parle de concepts de langage et non de syntaxe.

LRE
la source
9
Abandonnons l'idée que la programmation est censée être difficile.
Emploi

Réponses:

40

Quelques points en plus de ce qui a déjà été dit:

  • Python est dynamique. La création d'une classe est une instruction exécutable , tout comme l'importation d'un module; il peut être rendu conditionnel. Une classe peut être modifiée après la création. cela permet une métaprogrammation facile et une AOP.

  • Il n'y a pas d'interfaces; règles de frappe de canard. Si vous en avez désespérément besoin, il existe des 'classes de base abstraites (ABC)', mais vous ne manquez généralement pas d'interfaces, car il n'y a pas de vérification de type statique de toute façon.

  • Bien que tout soit un objet, les fonctions passent avant les objets. Avoir juste des fonctions (et pas de classes) dans un module convient parfaitement.

  • Tout est une entité de première classe. Passer des fonctions en tant que paramètres, les retourner et les affecter à des variables est la norme. Idem pour les cours. Les méthodes ne sont que des fonctions; vous pouvez gérer une méthode d'instance comme s'il s'agissait d'une fonction standard, la transmettre, etc.

  • Utilisez des dict, des ensembles, des listes et des tuples intégrés. Les listes et les dict sont mutables, les n-uplets ne le sont pas. Tous sont très efficaces et syntaxiquement succincts. Habituez-vous à renvoyer plusieurs valeurs d'une fonction à l'aide d'un tuple (vous n'avez même pas besoin de parenthèses). Habituez-vous à remplacer les hiérarchies complexes d’objets très simples par des objets composés de listes simples, de tuples et de dicts ('hashtables'), cela simplifie la vie.

  • Python supporte assez bien la PF. apprendre la compréhension des listes, puis les itérateurs et les générateurs. Ceux-ci aident beaucoup.

  • Tous les opérateurs peuvent être surchargés en définissant les méthodes appropriées. Ainsi, l’ajout ou la comparaison peut renvoyer ce que vous voulez. Rappelez-vous cela en travaillant avec des choses comme SQLAlchemy.

  • Il n'y a pas de null, seulement None, un objet à part entière. Vous pouvez imprimer Aucune parfaitement, etc. Passage Aucune lorsqu'une autre instance est attendue se traduit généralement par une erreur AttributeError, pas par un NPE, parfois plus loin dans le pipeline d'exécution.

  • En raison de la nature entièrement dynamique de Python, vous n’avez pratiquement aucun contrôle statique . Vous pouvez faire référence à un nom qui n'existe jamais dans votre programme (par exemple, une faute de frappe) ou qui n'est défini que dans un chemin d'exécution particulier. Rien ne vous le rappellera jusqu'à ce que l'exécution atteigne réellement cette référence et qu'une erreur NameError soit générée. Soyez prudent avec la portée de vos variables et écrivez plus de tests unitaires.

  • En raison de la nature entièrement dynamique de Python, les objets sont presque toujours malléables. Généralement, vous pouvez ajouter des champs et des méthodes même à une instance et ainsi supprimer ou écraser par inadvertance son état ou son ensemble de méthodes. Soyez prudent lors de l'attribution des attributs. Cela permet aussi des possibilités intéressantes :)

  • Il n'y a pas de constantes symboliques , seulement des variables. Vérifiez que vous n'écrasez pas par inadvertance une "constante". Si vous voulez être absolument sûr que vous ne pouvez pas écraser une constante, utilisez une fonction ou une propriété (qui est une fonction dissimulée).

  • Les threads de Python conviennent au traitement lié aux entrées / sorties, mais pas au processeur. N'essayez pas d'accélérer une tâche de calcul en l'exécutant dans des threads parallèles.

9000
la source
+1 très bons points. Nitpicking: Nonecause généralement AttributeError(mais cela n'a pas d'importance, vous n'en avez généralement pas besoin de toute façon) et vous pouvez (et dans certains cas devriez) écrire des objets immuables (par exemple, à travers namedtuple).
@danlan: merci, j'ai corrigé le texte :) Oui, vous pouvez créer des objets immuables. Mais les objets que vous créez généralement en créant une classe régulière, puis ses occurrences sont très modifiables, à moins que vous ne preniez un certain nombre de mesures spéciales. Le fait que l'attribution à un attribut d'instance non défini le définisse généralement de manière silencieuse au lieu de provoquer une erreur peut être une surprise pour un programmeur Java.
9000
1
Python (et d'autres langages FP) remplace la construction de code plus détaillée de blocs de construction plus simples par un code compact basé sur des blocs de construction plus complexes. Pensez aux processeurs RISC et CISC.
Paul
1
J'ajouterais des ensembles aux structures de données.
Sakisk
2
Un peu plus de 3 ans depuis que j'ai posé cette question. Je dois dire que ce conseil a très bien résisté.
LRE
14

Lisez cet article: Python n'est pas Java . (De plus, la plupart des autres articles de l'encadré valent la peine d'être lus, même s'ils ne sont pas liés à Java.) Cet article fournit des indications précieuses sur la manière dont les programmeurs Java peuvent utiliser involontairement Python (et comment ne pas l'utiliser).

cyclope
la source
6
"XML n'est pas la réponse." - Cela va bien au-delà de Java v Python ;-)
LRE
3

Je suis passé de Java à Python et l’une des choses les plus utiles que j’ai trouvée était de pouvoir tester le code à partir de l’interpréteur de ligne de commande. Tapez python dans la ligne de commande et exécutez votre code à partir de là jusqu'à ce que vous obteniez le résultat souhaité.

Les frameworks étaient également un peu moins définis en Python. Il y a des dizaines de cadres Web qui fonctionnent uniquement pour les débutants. Django remplace plus ou moins Spring et SQL Alchemy pour Hibernate.

Bassdread
la source
2

Une chose importante serait de comprendre le typage dynamique; une autre est que les objets sont mutables et publics. Moins important, du moins au début, est la corrélation de noms vs les variables.

class MyJob:
    pass        # an empty class
job = MyJob()
job.title = "Ruler of Omicron Persei 8"
job.startDate = "2086"
job.startDate = time.strptime("2035/01/02", "%Y/%m/%d")
myjobtitle = job.title
import new
def myjobduration(self, when):  # create a function
    return when - time.mktime(self.startDate)
MyJob.duration = myjobduration
job.duration(time.time()) # now

Ici, myjobtitle et la valeur de job.title pointent sur le même objet. L'attribut de classe job.startDate a d'abord été attribué à une chaîne, puis à un objet de temps. Et à travers tout cela, l'instance de travail et même la classe elle-même pourraient être changées de manière dynamique.

Arcege
la source
1

Vous voudrez peut-être aussi jeter un coup d'œil à Jython . Il ne supporte peut-être que Python 2.5, mais nous trouvons très puissant de pouvoir rapidement prototyper avec Python puis de le réécrire ultérieurement en Java si nécessaire.

D'après ma réponse à Que devrais-je penser lors du passage de Python à Java? comme cette question a maintenant été fermée comme une copie de celle-ci!

Mark Booth
la source