73 votes

Conseils pour les programmeurs en C# écrivant en Python

J'ai principalement fait du développement en C# ces dernières années, mais j'ai récemment commencé à faire un peu de Python (pas Iron Python). Mais je ne suis pas sûr d'avoir fait le saut mental vers Python... J'ai l'impression d'essayer de faire les choses comme je le ferais en C#.

Avez-vous des conseils sur la manière dont je peux pleinement profiter de Python?

Ou des astuces, des choses à apprendre davantage, des choses à surveiller?

154voto

e-satis Points 146299

Tout d'abord, vérifiez tgray de et Lundström conseils.

Ensuite, certaines choses que vous voudrez peut-être savoir:

  • Python est dynamiquement typé, donc, à la différence de C#, vous ne serez pas type de chèque mais un comportement. Vous pouvez google à propos de canard la frappe. Il implique que vous n'avez pas à traiter avec la boxe et unboxing.

  • Python est entièrement orienté objet, mais la syntaxe n'est pas appliquer ce paradigme. Vous pouvez écrire sans l'aide de Python le mot "classe".

  • La bibliothèque d'interface graphique en vedette avec Python ne peut pas comparer avec De C#. Vérifier PyQt, GTK ou wxPython bibliothèques.

  • Python a beaucoup de concepts que vous ne pouvez pas être familier avec: liste des compréhensions, des générateurs (le"rendement" n'existe pas en C# mais n'est pas beaucoup utilisée), les décorateurs, les metaclasses, etc. Ne pas ayez peur, vous pouvez programmer en Python sans eux. Ils sont juste des outils intelligents n'est pas obligatoire.

  • Comme en C#, Python standard library est énorme. Toujours regarder lorsque vous rencontrez un quelconque problème. Il est le plus probablement que quelqu'un a déjà résolu.

  • Python utiliser la liaison TARDIVE et les étiquettes des variables. C'est beaucoup trop début pour quelqu'un en commençant par la langue de s'inquiéter à ce sujet, mais n'oubliez pas qu'un jour, vous rencontrerez un comportement avec les variables qui SEMBLE illogique, et vous aurez vérifier que. Pour le moment:

Rappelez-vous juste de ne jamais faire ce qui suit:

def myfunc(my_list=[]) :
   # bla

Au lieu de cela:

def myfunc(my_list=()) :
   my_list = list(my_list)

Et vous serez bon. Il y a une bonne raison à cela, mais ce n'est pas le point :-)

  • Python est multi plate-forme, profiter de l'écriture sur Mac, et fonctionner sur Linux, si vous le souhaitez.

  • Python n'est pas fourni avec un complexe IDE (vous l'avez d'INACTIVITÉ:-)). Si vous êtes un Visual Studio addict, consultez la Clairière. C'est pas aussi avancé que Visual Studio, mais c'est toujours un bon RAD.

  • Si vous souhaitez développer quelques applications web en Python, rappelez-vous que Python n'est pas .NET. Vous devez ajouter un site web cadre à elle si vous voulez comparer. J'aime Django.

  • Python n'a pas besoin d'un énorme IDE de travailler avec. SciTE, Notepad++, INACTIF, Kate, gedit... Léger éditeurs sont vraiment suffisant.

  • Python applique une indentation d'utiliser des espaces et de saut de ligne, vous ne pouvez pas changer cela. Vous devriez éviter d'utiliser des onglets pour l'indentation et de choisir des espaces à la place. L'équivalent de vide bracelets {} est le mot "pass".

  • Python n'a pas d'appliquer privé de vars. Vous pouvez définir un private var à l'aide de "__" (2 trait de soulignement) au début de le var nom, mais c'est toujours insertions by-passables dans certains délicat façons. Python généralement supposer programmeurs sont des adultes qui savent ce qu'ils font et de communiquer.

  • Python utilise itération. Beaucoup. Beaucoup de beaucoup de. Et donc, la module itertools est le meilleur ami.

  • Python n'a pas de délégués. Le délégué du module pas ce que vous en pensez. Pour la programmation événementielle, utiliser un GUI lib (ou code le patron de vous-même, ce n'est pas que difficile).

  • Python est un interprète: vous pouvez tester presque tout, vivre. Il doit toujours être en cours d'exécution à côté de votre texte de l'éditeur. Python interpréteur basic n'est pas beaucoup, essayez de IPython pour quelque chose de savoureux.

  • Python est autodocumented: utilisation docstrings dans votre propre code et consulter d'autres de l'aide "help()" dans l'interpréteur python

Module de base :

  • sys: manipuler les fonctionnalités du système
  • os: définir les informations d'identification, de manipuler les chemins de fichiers, les renommer, les récursive fichier à pied, etc
  • shutil: traitement des fichiers de commandes (telles que la suppression récursive)
  • re: regexp
  • urllib et urllib2: HTTPscripting comme le téléchargement, la post / get s'agit des requêtes, etc
  • datetime: manipuler la date, l'heure ET la DURÉE
  • fil de discussion: vous vous en doutez
  • zlib: la compression
  • pickle: la sérialisation
  • xml: analyse / Rédaction XML avec SAX ou DOM

Il y a des centaines de modules. Profitez de.

Quelques exemples de façons de faire les choses en Python:

Boucles:

Python codeurs utilisent massivement l'équivalent de la boucle foreach C# boucle, et le préfèrent à tous les autres :

De base itérations:

for item in collection:
    print str(item)

"collection" peut être une chaîne de caractères, une liste, un tuple... Tout itératif: tout objet de définir les .la méthode next (). Il y a beaucoup de iterables en Python. E. g: typiquement, un langage Python pour lire les fichiers:

for line in open("/path/to/file") :
    print line

Un raccourci vers la boucle est appelée "liste de compréhension". C'est une façon de créer un nouvel objet iterable en une seule ligne:

Création d'une liste filtrée avec la compréhension de liste:

my_list = [item for item in collection if condition]

La création d'une nouvelle liste, avec une compréhension de liste:

my_list = [int(item) * 3 for item in collection]

La création d'un nouveau générateur avec une compréhension de liste:

my_list = (int(item) * 3 for item in collection)

Même que ci-dessus, mais les valeurs sont générées à la volée lors de la première itération, puis perdu. Plus d'infos à ce sujet ici.

Ordinaire pour la boucle

Si vous souhaitez exprimer une habitude pour la boucle, vous pouvez utiliser le xrange() fonction. for (int i = 0; i < 5; i++) devient:

for i in xrange(0,5) :

faire tout en équivalent

Il n'y a pas de "Faire Tout" en Python. Je n'ai jamais manqué, mais si vous devez utiliser cette logique, procédez de la manière suivante:

while True : # yes, this is an infinite loop. Crazy, hu ?

  # do your stuff

  if condition :
      break

Déballage

La permutation des variables:

a, b = b, a

Plusieurs assignations:

Le ci-dessus ne sont que le résultat de ce que nous appelons le "déballage" (ici appliqué à un n-uplet). Une façon simple d'expliquer c'est que vous pouvez attribuer à chaque valeur de n'importe quelle séquence directement sur un pied d'égalité nombre des variables, en une seule ligne:

animal1, animal2, animal3, animal4 = ["cow", "dog", "bird", "fish"]

Cela a beaucoup de conséquences. Lors de l'itération sur une tableau multidimensionnel, vous devez normalement obtenir chaque sous-séquence un par un, puis de l'utiliser, de l'e.g :

agenda = [("steve", "jobs"), ("linus", "torvald"), ("bill", "gates"),("jon", "skeet")]
for person in agenda:
    print person[0], person[1]

Mais avec le déballage, vous pouvez affecter directement les valeurs de les variables ainsi:

agenda = [("steve", "jobs"), ("linus", "torvald"), ("bill", "gates"),("jon", "skeet")]
for name, lastname in agenda:
    print name, lastname

Et c'est pourquoi, si vous voulez obtenir un indice lors de l'itération, Python codeurs utilisation suivantes idiomes (enumerate() est une fonction standard):

for index, value in enumerate(sequence) :
    print index, value

Déballage dans les appels de fonctions

C'est une utilisation avancée, vous pouvez passer si cela vous dérange.

Vous pouvez décompresser en utilisant le signe "*" pour utiliser une séquence directement dans un appel de fonction. E. g:

>>> foo(var1, var1, var3) :
    print var1, var2
    print var3
>>> seq = (3.14, 42, "yeah")
>>> foo(*seq)
3.14 42
yeah

Il est même plus que cela. Vous pouvez décompresser un dictionnaire comme les variables nommées, et d'écrire des prototypes de fonction avec *, ** d'accepter un nombre arbitraire d'arguments. Mais il n'est pas utilisé assez pour mériter de faire ce post encore plus longtemps :-).

Chaîne de formatage:

print "This is a %s on %s about %s" % ("post", "stackoverflow", "python")
print "This is a %(subject)s on %(place)s about %(about)s" % {"subject" : "post", "place" : "stackoverflow", "about" : "python"}

Le découpage d'un objet iterable:

Vous pouvez obtenir une partie d'un objet iterable à l'aide d'un très concis de la syntaxe:

print "blebla"[2:4] # print "eb"
last = string[:-1] # getting last element
even = (0,1,2,3,4,5,6,7,8,9)[::2] # getting evens only (third argument is a step)
reversed = string[::-1] # reversing a string

Vérifications logiques:

Vous pouvez vérifier la façon dont vous le faire en C#, mais il y a des "Pythonic" des moyens (plus court, plus clair :-)):

if 1 in (1, 2, 3, 4) : # check en element is in a sequence

if var : # check is var is true. Var == false if it's False, 0, (), [], {} or None

if not var : # contrary of above

if thing is var: # check if "thing" and "var" label the same content.

if thing is None : # we use that one because None means nothing in Python (almost null)

Combo (impression sur une seule ligne tous les mots contenant un "o" en majuscule ):

sentence = "It's a good day to write some code"
print " ".join([word.upper() for word in sentence.split() if "o" in word])

Sortie: "BON CODE"

Plus facile de demander pardon que demander la permission

Python codeurs n'est généralement pas le vérifier si quelque chose est possible. Ils sont un peu comme Chuck Norris. Ils le font. Ensuite, prendre le exception à la règle. Généralement, vous n'avez pas de vérifier si un fichier existe, vous essayez de l'ouvrir, et de revenir si il échoue:

try :
    f = open(file)
except IOerror :
    print "no file here !"

Bien sûr Chuck Norris n'utilise jamais sauf depuis qu'il n'échoue jamais.

La clause else

"D'autre" est un monde de nombreuses utilisations en Python. Vous trouverez "d'autre" après "si", mais après "sauf" et "pour".

for stuff in bunch :
    # do thing
else :
    # this always happens unless you hit "break" in the loop

Cela fonctionne pour la boucle "while" trop, même si nous n'utilisons pas cette boucle d'autant.

   try :
      # a crazy stuff
   except ToCrazyError :
      # this happens if the crazy stuff raises a ToCrazyError Exception
   else :
      # this will happen if there is no error so you can put only one line after the "try" clause
   finally :
      # the same as in C#

Si vous êtes curieux, voici un tas de pointe rapide et sale (mais agréable) les fragments Python.

16voto

Stefan Lundström Points 709
  • Abstenez-vous d'utiliser des classes. Utilisez des dictionnaires, des ensembles, des listes et des tuples.
  • Les setters et getters sont interdits.
  • Ne pas avoir de gestionnaires d'exceptions à moins que vous en ayez vraiment besoin - laissez-le planter avec style.
  • Pylint peut être votre ami pour un style de codage plus pythonique.
  • Quand vous serez prêt, découvrez les compréhensions de liste, les générateurs et les fonctions lambda.

13voto

Vilmorin Points 236

Si vous n'êtes pas nouveau en programmation, je recommanderais le livre "Dive into Python" de Mark Pilgrim. Il explique Python d'une manière qui rend facile de comprendre comment les techniques et les idiomes de Python peuvent être appliqués pour construire des applications pratiques.

6voto

Can Berk Güder Points 39887

Commencez par lire The Zen of Python

Vous pouvez le lire en suivant le lien ci-dessus, ou simplement taper import this dans l'invite Python. =)

Profitez des fonctionnalités de Python non offertes* par C#

Comme le duck-typing, les métaclasses, la compréhension de listes, etc.*

Écrivez des programmes simples juste pour tester ces fonctionnalités. Vous vous habituerez (voire deviendrez accro) à elles en un rien de temps..

Jetez un œil à la bibliothèque standard Python

Pour ne pas réinventer la roue. N'essayez pas de tout lire, même un rapide coup d'œil à la table des matières peut vous faire gagner beaucoup de temps.


* Je sais que C# possède déjà certaines de ces fonctionnalités, mais d'après ce que je vois, elles sont soit assez récentes, soit peu utilisées par les développeurs C#. Merci de me corriger si je me trompe.

5voto

tgray Points 4002

Si vous ne l'avez pas encore entendu parler, Dive Into Python est un excellent point de départ pour quiconque apprend Python. Il contient également toute une série de astuces et conseils.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X