web-dev-qa-db-fra.com

Conseils pour le programmeur C # qui écrit Python

Je fais principalement du développement en C # depuis quelques années, mais j'ai récemment commencé à utiliser un peu de Python (pas Iron Python). Mais je ne suis pas sûr d'avoir fait le saut mental en Python ... Je sens que j'essaie de faire les choses comme je le ferais en C #.

Des conseils sur la façon de tirer pleinement parti de Python?

Ou des trucs et astuces, des choses à apprendre, des choses à surveiller?

73
Gern Blanston

Tout d’abord, consultez les conseils de tgray _ et de Lundström .

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

  • Python est typé dynamiquement, donc contrairement à C #, vous ne vérifierez pas le type, mais le comportement. Vous voudrez peut-être google sur la frappe de canard. Cela implique que vous n'avez pas à traiter avec la boxe et le déballage.

  • Python est entièrement orienté objet, mais la syntaxe n’impose pas ce paradigme. Vous pouvez écrire en Python sans utiliser le mot "classe".

  • La bibliothèque d'interface graphique fournie avec Python ne peut être comparée à celle de C #. Vérifiez les bibliothèques PyQt , GTK ou wxPython .

  • Python a beaucoup de concepts que vous ne connaissez peut-être pas: compréhension de liste, générateurs (le "rendement" existe en C #, mais il est peu utilisé), décorateurs, métaclasses, etc. N'ayez pas peur; vous pouvez programmer en Python sans eux. Ce ne sont que des outils intelligents, pas obligatoires.

  • Comme en C #, la bibliothèque standard Python est énorme. Toujours le regarder quand vous rencontrez un problème. Il est fort probable que quelqu'un l'ait déjà résolu.

  • Python utilise les étiquettes de liaison et de variable LATE. Il est beaucoup trop tôt pour quelqu'un qui commence avec la langue à s'en soucier, mais souvenez-vous qu'un jour, vous rencontrerez un comportement avec des variables qui vous semblent illogiques, et vous devrez vérifier cela. Pour le moment:

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

def myfunc(my_list=[]) :
   # bla

Au lieu:

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

Et tu seras bon. Il y a une bonne raison à cela, mais ce n'est pas le problème :-)

  • Python est multi-plateforme, écrivez sur Mac et utilisez Linux si vous le souhaitez.

  • Python n'est pas fourni avec un complexe IDE (vous avez INACTIF :-)). Si vous êtes un accro de Visual Studio, vérifiez Glade . Ce n'est pas aussi avancé que Visual Studio, mais c'est quand même un bon RAD .

  • Si vous souhaitez développer une application Web en Python, n'oubliez pas que Python n'est pas .NET. Vous devez ajouter un cadre Web à celui-ci si vous souhaitez comparer. J'aime Django .

  • Python n'a pas besoin d'un énorme IDE pour travailler. SciTE , Notepad ++ , INACTIF , Kate , gedit ... Les éditeurs légers sont vraiment suffisants.

  • Python applique l'indentation à l'aide d'espaces et de sauts de ligne, vous ne pouvez pas changer cela. Vous devez éviter d'utiliser des tabulations pour l'indentation et choisir plutôt des espaces. L'équivalent de bracelets vides {} est le mot clé "pass".

  • Python n'impose pas les variables privées. Vous pouvez définir une variable privée en utilisant "__" (deux traits de soulignement) au début du nom de la variable, mais elle peut toujours être contournée de manière délicate. Python suppose généralement que les programmeurs sont des adultes qui savent ce qu’ils font et communiquent.

  • Python utilise l'itération. Beaucoup. Beaucoup beaucoup. Le module itertools est donc votre meilleur ami.

  • Python n'a pas de délégué intégré. Le module des délégués n’est pas ce que vous pensez. Pour la programmation événementielle, utilisez une bibliothèque graphique (ou codez vous-même le modèle, ce n’est pas si difficile).

  • Python a un interprète: vous pouvez tester presque tout, en direct. Il devrait toujours être en cours d'exécution à côté de votre éditeur de texte. L’interpréteur de base Python n’est pas grand chose, essayez IPython pour quelque chose de savoureux.

  • Python est auto-documenté: utilisez docstrings dans votre propre code et consultez les autres en utilisant "help ()" dans l'interpréteur python

Les bases du module:

  • sys: manipule les fonctionnalités du système
  • os: définir les informations d'identification, manipuler les chemins des fichiers, renommer, parcourir les fichiers de manière récursive, etc.
  • shutil: traitement de fichiers par lots (comme une suppression récursive)
  • re: regexp
  • urllib et urllib2: des scripts HTTP comme le téléchargement, les requêtes post/get, etc.
  • date/heure: manipuler la date, l'heure et la durée
  • fil: vous le devinez
  • zlib: compression
  • cornichon: sérialisation
  • xml: analyse/écriture de XML avec SAX ou DOM

Il y a des centaines de modules. Prendre plaisir.

Quelques façons typiques de faire des choses en Python:

Boucles:

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

Itérations de base:

for item in collection:
    print str(item)

"collection" peut être une chaîne, une liste, un Tuple ... Any iterable: tout objet définissant la méthode .next (). Il y a beaucoup d'itérables en Python. E.g: un idiome Python typique pour lire les fichiers:

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

Un raccourci vers la boucle for est appelé "compréhension de liste". C'est un moyen de créer un nouvel itérable dans une ligne:

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

my_list = [item for item in collection if condition]

Création d'une nouvelle liste avec une compréhension de liste:

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

Création d'un nouveau générateur avec une liste à comprendre:

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

Comme ci-dessus, mais les valeurs seront générées à la volée à la première itération, puis perdues. Plus d'informations à ce sujet ici .

Ordinaire pour boucle

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

for i in xrange(0,5) :

do while while équivalent

Il n'y a pas de "faire pendant" en Python. Je ne l'ai jamais manqué, mais si vous devez utiliser cette logique, procédez comme suit:

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

  # Do your stuff

  if condition :
      break

Déballage

Permutation de variables:

a, b = b, a

Assignations multiples:

Ce qui précède est simplement le résultat de ce que nous appelons le "décompactage" (appliqué ici à un tuple). Un moyen simple de l'expliquer consiste à affecter chaque valeur d'une séquence directement à un nombre égal de variables, sur une ligne:

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

Cela a beaucoup d'implications. Lors d'une itération sur un tableau multidimensionnel, vous obtenez normalement chaque sous-séquence une par une, puis vous l'utilisez, par exemple:

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

Mais avec la décompression, vous pouvez également affecter les valeurs directement aux variables:

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 index en itérant, les codeurs Python utilisent les idiomes suivants (enumerate () est une fonction standard):

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

Déballer dans les appels de fonctions

Ceci est une utilisation avancée, et vous pouvez le sauter si cela vous dérange.

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

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

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

Formatage de chaîne:

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"}

Trancher un itérable:

Vous pouvez obtenir n'importe quelle partie d'un itérable en utilisant une syntaxe très concise:

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 ce que vous faites en C #, mais il existe des méthodes "pythoniques" (plus courtes, plus claires :-)):

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 (imprimer sur une 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 À CERTAINS CODE"

Plus facile de demander pardon que la permission

Les codeurs Python ne vérifient généralement pas si quelque chose est possible. Ils sont un peu comme Chuck Norris. Ils le font Puis attraper l'exception. En règle générale, vous ne vérifiez pas si un fichier existe, vous essayez de l'ouvrir et vous annulez en cas d'échec:

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

Bien sûr, Chuck Norris n’utilise jamais d’exception car il n’échoue jamais.

La clause else

"Else" est un monde d'utilisations multiples en Python. Vous trouverez "else" après "if", mais après "sauf" et "pour" également.

for stuff in bunch :
    # Do things
else :
    # This always happens unless you hit "break" in the loop

Cela fonctionne aussi pour la boucle "while", même si nous n’utilisons pas autant cette boucle.

   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 quelques avancées avancées rapides et sales (mais sympa) extraits de Python .

151
e-satis
  • S'abstenir d'utiliser des cours. Utilisez des dictionnaires, des ensembles, des listes et des tuples.
  • Les setters et les getters sont interdits.
  • N'ayez pas de gestionnaires d'exceptions, sauf si vous en avez vraiment besoin - laissez-les planter avec style.
  • Pylint peut être votre ami pour plus de style de code pythonish.
  • Lorsque vous êtes prêt - consultez la liste des compréhensions, des générateurs et des fonctions lambda.
16
Stefan Lundström

Si vous n’êtes pas novice en programmation, je recommanderais le livre "Plongez dans Python" de Mark Pilgrim. Il explique Python de manière à ce qu'il soit facile de comprendre comment les techniques et les idiomes de Python peuvent être appliqués pour créer des applications pratiques.

13
Vilmorin

Commencez par lire Le zen de Python

Vous pouvez le lire sur le lien ci-dessus ou simplement taper import this à l'invite de Python. =)

Tirez parti des fonctionnalités Python non offertes * par C #

Tels que la frappe de canard, les métaclasses, la compréhension de liste, etc. *

Ecrivez des programmes simples juste pour tester ces fonctionnalités. Vous allez vous habituer (si ce n'est pas accro) à eux en un rien de temps.

Regardez la bibliothèque standard Python

Donc, vous ne réinventez pas la roue. N'essayez pas de tout lire, même un rapide coup d'œil sur la table des matières pourrait 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 peux voir, elles sont plutôt nouvelles ou pas couramment utilisées par les développeurs C #. Corrigez-moi si j'ai tort, s'il-vous plait.

6
Can Berk Güder

Au cas où vous n'en auriez pas encore entendu parler, Dive Into Python est un excellent point de départ pour quiconque apprend Python. Il a également un tas de Trucs et astuces .

5
tgray

Si vous apprenez mieux une nouvelle langue en prenant de petites mesures incrémentielles, je vous recommande d’utiliser IronPython . Sinon, utilisez la commande CPython et ne modifiez plus le code C # tant que vous n’avez pas l’impression de maîtriser Python.

3
Van Gale

Je suggérerais d'avoir un bon éditeur pour ne pas vous faire piquer par des espaces. Pour plus de simplicité, j'utilise simplement les packages Link de ActivePython, qui incluent un éditeur et toutes les bibliothèques win32api. Ils sont assez amusants à utiliser si vous utilisez C #. Le win32api en Python peut être un peu plus simple. Vous n'avez pas besoin de faire toute la chose DDLImport. Téléchargez ActivePython (fourni avec CPython), ouvrez-le et commencez à saisir des éléments sur la console. Vous le récupérerez assez facilement après avoir utilisé C #. Pour des informations plus intéressantes sur Python, essayez Code ActiveState , qui contient toutes sortes de recettes, ce qui peut vous permettre de voir très simplement différentes choses que vous pouvez faire avec Python.

2
jle

Je suis à peu près à votre place aussi, utilisant toujours C # pour la plupart de mes travaux, mais utilisant de plus en plus Python pour d'autres projets.

@ e-satis connait probablement Python de fond en comble et tous ses conseils sont excellents. De mon point de vue, la plus grande différence pour moi a été la suivante:

Retournez dans fonctionnel. pas nécessairement du code spaghetti, mais apprendre que tout ne doit pas nécessairement être dans un objet, il ne devrait pas l'être non plus.

L'interprète. C'est comme la fenêtre immédiate sauf 10 ^ 10 mieux. En raison du fonctionnement de Python, vous n'avez pas besoin de tous les bagages et la merde que C # vous fait mettre avant de pouvoir exécuter des tâches; vous pouvez simplement biffer quelques lignes et voir comment les choses fonctionnent.

J'ai normalement une instance IDLE dans laquelle je lance des extraits de code pendant que je travaille sur le fonctionnement des différents éléments de la langue lorsque je modifie mes fichiers ... par exemple. Je suis occupé à travailler sur une liste avec une carte, mais je ne suis pas à 100% sur le lambda, je devrais utiliser ... insérer quelques lignes dans IDLE, voir comment cela fonctionne et ce qu'il fait.

Et enfin, aimer dans la verbosité de Python, et je ne veux pas dire cela dans le sens long de la verbosité, mais comme l'a souligné e-satis, utiliser des verbes comme "in", "est", "pour", etc.

Si vous avez fait beaucoup de travail de réflexion en C #, vous aurez envie de pleurer quand vous verrez à quel point les mêmes choses sont simples en Python.

Bonne chance.

2
RonaldHobbs

Si vous avez une expérience en programmation et que vous n'avez pas envie de dépenser de l'argent, je vous le recommande Comment penser comme un informaticien en Python .

1
theycallmemorty

Et puis quelque chose dont vous pouvez bénéficier:

IPython Shell: achèvement automatique dans le shell. Il effectue des opérations par lots, ajoute une tonne de fonctionnalités, de journalisation, etc. >>> Jouez avec le coquillage - toujours!

easy_install/ pip : So Nice et un moyen facile d'installer une application Python tierce.

0
Lakshman Prasad