Je suis un programmeur novice avec une expérience de base Java et apprenez actuellement Python. J'ai trébuché sur ce blog post dans une autre question thread:
http : //dirtsimple.org/2004/12/python-is-not-java.html P>
Et j'ai quelques questions concernant le sujet posté: p> < HR>
1) "Oh, et toutes ces chaînes d'attributs foo.bar.baz ne viennent pas gratuitement, ..., chaque point comptent." P> blockQuote>
est la solution à ce problème particulier est l'importation de module et sa méthode à l'avance? Tels que: p>
xxx pré>
2) a eu une déclaration de commutation? La traduction de Python est une table de hachage, pas un tas de stations si-alors. P> blockQuote>
Il existe plusieurs réponses connexes concernant ce sujet, mais elles soumettent également quelques questions: p>
- L'utilisation de if-d'autre est plus propre, mais elle n'a pas l'avantage du temps constant O (1) dans l'état du commutateur. LI>
- Utilisation de HASH pour le temps constant O (1) Li>
- Utilisation de la fonction Lambda dans HASH pour comparaison (non recommandée)
- Pourquoi n'est-ce pas recommandé? Est-ce parce que la fonction Lambda supprime le facteur constant de Hash? Li> ul> li>
- Utilisation du module de bisect
- Cette méthode conserve-t-elle le temps constant O (1), ou il s'agit simplement d'un autre type de fonction Lambda? Li>
- Donc, quelle méthode en Python, qui est égale à l'énoncé de commutation, avec du temps constant O (1), tout en permettant une déclaration de comparaison? LI> ul> li> ol>
3) Les getters et les setters sont diaboliques. Mal, le mal, ne pas écrire des getters and setters ... c'est ce que l'intégré "de la propriété" est pour ... en Python, ce (getter and Setter) est stupide, car vous pouvez commencer par une normale attribuez et changez votre esprit à tout moment, sans affecter les clients de la classe. P> BlockQuote>
Je ne comprends pas vraiment cette partie. P>
En outre, il semble que dans la méthode python publique et privée ou variable puisse être facilement accessible, contrairement à celle de C ++ et Java. Y a-t-il une raison de conception de ce comportement? P>
Enfin, y a-t-il déjà recommandé de bien lire sur Python contre tout autre langage de programmation? P> P>
3 Réponses :
Peut-être. Ce n'est pas toujours faisable (ou possible em>) pour effectuer des importations spécifiques de cette manière. P> li>
Les fonctions Lambda sont dissuadées pour les raisons normales Les fonctions Lambda sont dissuadées (pas toutes, je suis d'accord avec). BISECT est une recherche binaire, donc c'est O (log n). p> li>
" récupération à partir de la dépendance " p> li>
ol>
BISECT CODE> Il suffit de connecter une liste ordonnée, la meilleure recherche que vous obtenez est O (log n) la recherche binaire. Vous voulez une déclaration de commutation? Utiliser des dicts. Comparions (à part contre == code>, bien sûr) SOMMES SUR LA PORTÉE DU SUCTUMENT CODE> ET LA PLUS CHOSES COMMUNAIRE AVEC LE CONTRÔLÉ ET FAIRE O (1) LOCKUP Impossible em> quand même. li>
- qu'en est-il de cela n'est pas compréhensible? Lorsque vous écrivez Python, vous n'écrivez pas les méthodes Getter ou Setter. Vous utilisez des attributs normaux. Si vous voyez plus tard que vous avez besoin d'une logique supplémentaire lors de l'accès / modification d'attribut, vous l'activez dans une propriété et que tout code à l'aide de celle-ci peut s'exécuter sans modifications. LI>
- En ce qui concerne l'absence de véritable vie privée - cela a été posé et répondit à plusieurs reprises, la réponse courte est que "nous sommes tous des adultes ici", c'est-à-dire que les programmeurs sont de confiance à ne pas violer des choses privées à moins d'avoir un très bonne raison. Une autre raison plus faible est que cela est difficile à mettre en œuvre dans une langue dynamique, au moins avec le modèle d'objet actuel (où les méthodes ne sont que des fonctions normales, par exemple). Li>
ol>
Une réponse est souvent d'utiliser des noms locaux (variables) qui font référence à l'instance d'objet spécifique en question (dans la portée de votre boucle, par exemple). La sémantique dynamique de la dynamique tardive de Python oblige son interprète à traverser tout "." Référence à chaque fois que les objets à laquelle chacun de ceux-ci est limité peut avoir été modifié par des itérations précédentes à travers notre boucle. Comme avec la plupart des autres commentaires sur la performance, cela ne fait pas grand nombre de différences tant que vous n'oublissez pas à grande échelle (des millions d'itérations de boucle multipliées par plusieurs couches de "." Dérovinférences) P> Li>
Parfois, la meilleure approche consiste à repenser votre conception et à utiliser des objets "plus intelligents". On utilise fréquemment des instructions de commutation / de cas permettant de mettre en œuvre différents comportements dans une classe d'objets où l'on pourrait implémenter un certain nombre de classes connexes, chacune desquelles «faire la bonne chose» basée sur leur propre type. D'autres fois, comme suggère le commentaire, vous allez créer un dictionnaire ("hash") de clés et d'objets (fonctions, instances, lambdas, quoi que ce soit) et l'utiliser comme table d'expédition. P> li>
Python vous permet d'accéder directement aux attributs (sans méthodes de getter / setter) et, si vous devez le faire, vous pouvez utiliser des propriétés pour vous assurer que votre propre code (getter / setter) est exécuté implicitement. Les utilisateurs de votre code ne doivent pas avoir à savoir ou n'enregisent pas comment Oui, les attributs et les méthodes peuvent être facilement accessibles et «les cacher» est difficile. Il rend la langue plus facile à utiliser. (Le contre-argument de la contre-dispute qu'il facilite les cours de «abus» - c'est qu'il permet aux utilisateurs d'accéder aux détails de la mise en œuvre d'une classe qui ne sont pas destinés à être publics ... cela ne les oblige pas à respecter les envies. abstractions. C'est un point de théâtre. Si votre classe documente l'interface envisagée et les implémentons raisonnablement, ce sont les interfaces que la plupart des programmeurs utiliseront. S'ils ressentent la nécessité de faire votre boue avec vos détails de mise en œuvre, vous avez probablement mal de mal --- et Leur alternative consiste simplement à réapprouer tout ce que vous avez fait pour contourner les limitations que vous avez imposées). P> foo.bar = 1 code> lie directement une nouvelle valeur à FOO code> 'S bar code> Attribut ou si elle appelle une méthode de FOO code> qui effectue une manipulation internationale de l'état qui serait visible en accédant à foo.bar code> plus tard. Ce sont des détails de la mise en œuvre. Avoir la langue d'encourager les programmeurs à mettre en œuvre toutes les références d'objet / attribut comme explicite ".get ()" et ".SeReSet ()" appelle tout en soutenant plus simple "". La syntaxe confère non profiter au code; Cela rend le code plus encombré et plus difficile à lire. P> li>
ol>
Si vous avez plusieurs questions, veuillez les diviser dans plusieurs questions.
Oui, veuillez diviser votre question en plusieurs questions plus ciblées.
N'essayez pas d'apprendre tout langage de programmation en tirant parti de la connaissance d'un autre langage de programmation. Les langages de programmation (à quelques exceptions près) sont plus différentes que semblables. C'est beaucoup plus facile sur votre cerveau de commencer "de zéro" lors de l'apprentissage d'une nouvelle langue. Essayez d'éviter de comparer la syntaxe ou la sémantique entre les langues.