Ratschläge für C # -Programmierer, die Python schreiben [geschlossen]

72

Ich habe in den letzten Jahren hauptsächlich C # -Entwicklung betrieben, aber vor kurzem angefangen, ein bisschen Python (nicht Iron Python) zu machen. Aber ich bin mir nicht sicher, ob ich den mentalen Sprung zu Python geschafft habe ... Ich habe das Gefühl, dass ich versuche, Dinge so zu tun, wie ich es in C # tun würde.

Irgendwelche Ratschläge, wie ich Python voll ausnutzen kann?

Oder irgendwelche Tipps / Tricks, Dinge, über die man mehr lernen kann, Dinge, auf die man achten muss?

Gern Blanston
quelle
10
Die Tatsache, dass Sie sogar erkennen, dass Sie C # -Gewohnheiten verwenden, deutet darauf hin, dass Sie den meisten Menschen weit voraus sind, wenn sie eine neue Sprache verwenden :)
Jon Skeet

Antworten:

155

Überprüfen Sie zunächst die Ratschläge von tgray und Lundström .

Dann einige Dinge, die Sie vielleicht wissen möchten:

  • Python ist dynamisch typisiert, sodass Sie im Gegensatz zu C # nicht den Typ, sondern das Verhalten überprüfen. Vielleicht möchten Sie über das Tippen von Enten googeln. Dies bedeutet, dass Sie sich nicht mit Boxen und Unboxing befassen müssen.

  • Python ist vollständig objektorientiert, aber die Syntax erzwingt dieses Paradigma nicht. Sie können Python schreiben, ohne das Wort "Klasse" zu verwenden.

  • Die in Python enthaltene GUI-Bibliothek kann nicht mit C # verglichen werden. Überprüfen Sie die PyQt- , GTK- oder wxPython- Bibliotheken.

  • Python hat viele Konzepte, mit denen Sie möglicherweise nicht vertraut sind: Listenverständnisse, Generatoren ("Ausbeute" existiert in C #, wird aber nicht häufig verwendet), Dekoratoren, Metaklassen usw. Haben Sie keine Angst; Sie können in Python ohne sie programmieren. Sie sind nur intelligente Werkzeuge, nicht obligatorisch.

  • Wie in C # ist die Python-Standardbibliothek riesig. Schauen Sie immer darauf, wenn Sie auf ein Problem stoßen. Es ist sehr wahrscheinlich, dass jemand es bereits gelöst hat.

  • Python verwendet LATE-Bindung und Variablenbeschriftungen. Es ist viel zu früh für jemanden, der mit der Sprache beginnt, sich darüber Gedanken zu machen, aber denken Sie daran, dass Sie eines Tages auf ein Verhalten mit Variablen stoßen werden, das unlogisch erscheint, und das müssen Sie überprüfen. Für den Moment:

Denken Sie daran, niemals Folgendes zu tun:

def myfunc(my_list=[]) :
   # bla

Stattdessen:

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

Und du wirst gut sein. Dafür gibt es einen guten Grund, aber darum geht es nicht :-)

  • Python ist plattformübergreifend, schreibt gerne auf Mac und läuft auf Wunsch unter Linux.

  • Python wird nicht mit einer komplexen IDE geliefert (Sie haben IDLE :-)). Wenn Sie Visual Studio-süchtig sind, überprüfen Sie Glade . Dies ist nicht so fortgeschritten wie Visual Studio, aber es ist immer noch ein gutes RAD .

  • Wenn Sie eine Webanwendung in Python entwickeln möchten, denken Sie daran, dass Python nicht .NET ist. Sie müssen ein Webframework hinzufügen, wenn Sie vergleichen möchten. Ich mag Django .

  • Python benötigt keine große IDE, um damit zu arbeiten. SciTE , Notepad ++ , IDLE , Kate , gedit ... Leichte Editoren sind wirklich ausreichend.

  • Python erzwingt das Einrücken mit Leerzeichen und Zeilenumbrüchen. Das können Sie nicht ändern. Sie sollten die Verwendung von Registerkarten zum Einrücken vermeiden und stattdessen Leerzeichen auswählen. Das Äquivalent zu leeren Armbändern {} ist das Schlüsselwort "pass".

  • Python erzwingt keine privaten Variablen. Sie können eine private Variable mit "__" (zwei Unterstriche) am Anfang des Variablennamens definieren, sie ist jedoch auf schwierige Weise umgangen. Python geht normalerweise davon aus, dass Programmierer erwachsen sind, die wissen, was sie tun und kommunizieren.

  • Python verwendet die Iteration. Viel. Viel viel. Und so ist das itertools-Modul Ihr bester Freund.

  • Python hat keine eingebauten Delegaten. Das Delegatenmodul ist nicht das, was Sie denken. Verwenden Sie für die ereignisgesteuerte Programmierung eine GUI-Bibliothek (oder codieren Sie das Muster selbst, es ist nicht so schwierig).

  • Python hat einen Interpreter: Sie können fast alles live testen. Es sollte immer neben Ihrem Texteditor ausgeführt werden. Python Basic Interpreter ist nicht viel, versuchen Sie IPython für etwas Leckeres.

  • Python ist automatisch dokumentiert: Verwenden Sie docstrings in Ihrem eigenen Code und konsultieren Sie andere mithilfe von "help ()" im Python-Interpreter

Modulgrundlagen:

  • sys: Systemfunktionen bearbeiten
  • os: Anmeldeinformationen festlegen, Dateipfade bearbeiten, umbenennen, rekursiven Dateispaziergang usw.
  • shutil: Batch-Dateiverarbeitung (z. B. rekursives Löschen)
  • re: regexp
  • urllib und urllib2: HTTP-Skripte wie Herunterladen, Veröffentlichen / Abrufen von Anfragen usw.
  • Datum / Uhrzeit: Datum, Uhrzeit UND DAUER bearbeiten
  • Thread: Sie raten es
  • zlib: Komprimierung
  • pickle: Serialisierung
  • xml: XML mit SAX oder DOM analysieren / schreiben

Es gibt Hunderte von Modulen. Genießen.

Einige typische Methoden, um Dinge in Python zu tun:

Schleifen:

Python-Codierer verwenden massiv das Äquivalent der foreachC # -Schleife und ziehen es anderen vor:

Grundlegende Iterationen:

for item in collection:
    print str(item)

"Sammlung" kann eine Zeichenfolge, eine Liste, ein Tupel sein ... Beliebig iterierbar: Jedes Objekt, das die .next () -Methode definiert. Es gibt viele iterable in Python. Beispiel: Eine typische Python-Sprache zum Lesen von Dateien:

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

Eine Verknüpfung zur for-Schleife wird als "Listenverständnis" bezeichnet. Es ist eine Möglichkeit, eine neue Iterable in einer Zeile zu erstellen:

Erstellen einer gefilterten Liste mit Listenverständnis:

my_list = [item for item in collection if condition]

Erstellen einer neuen Liste mit Listenverständnis:

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

Erstellen eines neuen Generators mit Listenverständnis:

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

Wie oben, aber die Werte werden sofort bei der ersten Iteration generiert und gehen dann verloren. Weitere Informationen dazu hier .

Gewöhnlich für Schleife

Wenn Sie eine übliche for-Schleife ausdrücken möchten, können Sie die Funktion xrange () verwenden. for (int i = 0; i < 5; i++)wird:

for i in xrange(0,5) :

tun, während gleichwertig

In Python gibt es kein "Do While". Ich habe es nie verpasst, aber wenn Sie diese Logik verwenden müssen, gehen Sie wie folgt vor:

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

  # Do your stuff

  if condition :
      break

Auspacken

Variablen tauschen:

a, b = b, a

Mehrfachzuweisungen:

Das Obige ist nur ein Ergebnis dessen, was wir "Auspacken" nennen (hier angewendet auf ein Tupel). Eine einfache Möglichkeit, dies zu erklären, besteht darin, dass Sie jeden Wert einer beliebigen Sequenz direkt einer gleichen Anzahl von Variablen in einer Zeile zuweisen können:

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

Dies hat viele Auswirkungen. Während Sie in einem mehrdimensionalen Array iterieren, erhalten Sie normalerweise jede Teilsequenz einzeln und verwenden sie dann, zum Beispiel:

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

Beim Entpacken können Sie die Werte aber auch direkt Variablen zuweisen:

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

Wenn Sie während der Iteration einen Index erhalten möchten, verwenden Python-Codierer die folgenden Redewendungen (enumerate () ist eine Standardfunktion):

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

Funktionsaufrufe auspacken

Dies ist eine fortgeschrittene Verwendung, und Sie können sie überspringen, wenn es Sie stört.

Sie können Werte mit dem Zeichen "*" entpacken, um eine Sequenz direkt in einem Funktionsaufruf zu verwenden. Z.B:

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

Es gibt noch mehr als das. Sie können ein Wörterbuch als benannte Variablen entpacken und Funktionsprototypen mit schreiben *, **um eine beliebige Anzahl von Argumenten zu akzeptieren. Aber es hat nicht genug verdient, um diesen Beitrag noch länger zu machen :-).

String-Formatierung:

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

Iterable in Scheiben schneiden:

Sie können jeden Teil eines Iterables mit einer sehr präzisen Syntax abrufen:

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

Logische Überprüfungen:

Sie können überprüfen, wie Sie es in C # tun, aber es gibt "pythonische" Möglichkeiten (kürzer, klarer :-)):

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 (alle Wörter, die ein "o" in Großbuchstaben enthalten, in eine Zeile drucken):

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

Ausgabe: "GUT ZU EINIGEM CODE"

Es ist einfacher, um Vergebung zu bitten als um Erlaubnis

Python-Codierer prüfen normalerweise nicht, ob etwas möglich ist. Sie sind ein bisschen wie Chuck Norris. Sie machen es. Dann fangen Sie die Ausnahme. In der Regel überprüfen Sie nicht, ob eine Datei vorhanden ist, sondern versuchen, sie zu öffnen, und führen einen Rollback durch, wenn sie fehlschlägt:

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

Natürlich verwendet Chuck Norris niemals Ausnahmen, da er niemals versagt.

Die else-Klausel

"Else" ist eine Welt mit vielen Verwendungsmöglichkeiten in Python. Sie finden "sonst" nach "wenn", aber auch nach "außer" und "für".

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

Dies funktioniert auch für die "while" -Schleife, auch wenn wir diese Schleife nicht so oft verwenden.

   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#

Wenn Sie neugierig sind, finden Sie hier eine Reihe fortgeschrittener schneller und schmutziger (aber netter) Python-Schnipsel .

E-Satis
quelle
1
Beeindruckend! Zwei Dinge, die ich sagen würde: 1. Verwenden Sie elementtree für xml. 2. Variabler Austausch ist ein Beispiel für das Auspacken von Tupeln. Vielleicht möchten Sie das Auspacken erwähnen, da Sie so umfassend sind :-)
John Fouhy
+1 für den netten Link sebsauvage.net/python/snyppets/index.html Es gibt ein wirklich gutes Beispiel für die GUI-Programmierung, wenn Sie mehr darüber erfahren möchten.
Martin
@Fouhy: +1 für Elementbaum. Aber ich versuche, mich von nicht standardmäßigen Bibliotheken fernzuhalten, während ich einem Neuling Python erkläre. Zu viele gute Dinge sind beängstigend :-) Das Verdienen über die 1000 GUI lib ist beängstigend genug :-) Sie haben Recht zum Auspacken. Ich suche nach einer einfachen Möglichkeit, es zu erklären und zurück zu sein, sobald ich es habe.
E-Satis
4
+1 beeindruckend gründlich
Mizipzor
3
Wow, sie machten keine Witze, als sie sagten, Pythonisten seien nett zu Neulingen!
Gideon
16
  • Verwenden Sie keine Klassen. Verwenden Sie Wörterbücher, Mengen, Listen und Tupel.
  • Setter und Getter sind verboten.
  • Haben Sie keine Ausnahmebehandlungsroutinen, es sei denn, Sie müssen dies wirklich tun - lassen Sie es stilvoll abstürzen.
  • Pylint kann dein Freund für einen pythonischeren Codierungsstil sein.
  • Wenn Sie bereit sind, sehen Sie sich Listenverständnisse, Generatoren und Lambda-Funktionen an.
Stefan Lundström
quelle
Ich stimme zu und füge +1 hinzu, stimme aber dem dritten Punkt nicht zu. Ich denke, die Verwendung von Ausnahmebehandlungsroutinen in der Codelogik ist in der Tat ziemlich pythonisch (auch bekannt als "Es ist einfacher, um Vergebung zu bitten als um Erlaubnis").
ChristopheD
1
"Setter sind Getter sind fobidden." - Englisch scheitern? Ich verstehe nicht ganz.
Strager
@strager: Ich habe es gelesen als "Sie dürfen keine Setter und Getter schreiben" (oder besser gesagt: "Sie werden vom Schreiben abgehalten ..."). Was stimmt damit nicht?
Joachim Sauer
Der Punkt ist, dass Setter und Getter so gedacht werden sollten, als ob sie verboten wären. Sie können sie schreiben, aber die meisten werden fragen, warum? Warum nicht das Attribut verwenden? Warum nicht eine Eigenschaft definieren?
S.Lott
1
@ Jason Baker: Nun, der Rat ist für einen C # -Programmierer, der möglicherweise Klassen für Datencontainer erstellt, in denen Python bereits eine Vielzahl von Optionen bietet.
Stefan Lundström
13

Wenn Sie nicht neu in der Programmierung sind, würde ich das Buch "Dive into Python" von Mark Pilgrim empfehlen . Es erklärt Python auf eine Weise, die es leicht macht zu verstehen, wie Python-Techniken und -Sprachen zum Erstellen praktischer Anwendungen angewendet werden können.

Vilmorin
quelle
6

Beginnen Sie mit dem Lesen des Zen of Python

Sie können es unter dem obigen Link lesen oder einfach import thisan der Python-Eingabeaufforderung eingeben. =)

Nutzen Sie die Python-Funktionen, die C # nicht bietet *

Wie Ententypisierung, Metaklassen, Listenverständnis usw. *

Schreiben Sie einfache Programme, um diese Funktionen zu testen. Sie werden sich in kürzester Zeit an sie gewöhnen (wenn Sie nicht süchtig sind).

Schauen Sie sich die Python Standard Library an

Sie erfinden das Rad also nicht neu. Versuchen Sie nicht, das Ganze zu lesen. Selbst ein kurzer Blick auf das Inhaltsverzeichnis kann Ihnen viel Zeit sparen.


* Ich weiß, dass C # bereits einige dieser Funktionen hat, aber soweit ich sehen kann, sind sie entweder ziemlich neu oder werden von C # -Entwicklern nicht häufig verwendet. Bitte korrigieren Sie mich, falls ich falsch liege.

Kann Berk Güder
quelle
1
Denken Sie wirklich, dass jemand, der neu in Python ist, mit Metaklassen herumspielen sollte?
John Fouhy
1
@ John: Klar, warum nicht? Es ist nicht so, dass Metaklassen ein großer roter Knopf sind, auf dem "Start Nuclear War" steht. Das schlimmste Szenario ist, dass sein Programm nicht funktioniert. Wie kann er Python lernen, ohne sich die Hände schmutzig zu machen? =)
Kann Berk Güder
Nach Jahren von Python begann ich Metaklasse zu verstehen. Ich bin vielleicht dümmer als der durchschnittliche Programmierer, aber ich würde es nicht empfehlen.
E-Satis
Ich bin brandneu in Python und wenn mir jemand sagt, dass ich "Metaclasses" nicht verwenden soll, werde ich jetzt ein "Bedürfnis" finden, sie zu verwenden. Das lustigste Mal, dass ich seit PowerBuilder eine neue Sprache gelernt habe. Java hat es einfach nicht für mich getan, Javascript ist großartig, aber die guten Frameworks wurden aus der Open-Source-Community von schlechten Unternehmen wie Telerik und Kendo gestohlen, die von der Community entwickelte Software zu Preisen verkaufen, bei denen sich Erpressung gut anfühlt.
Rich Bianco
3

Wenn Sie jemand sind, der eine neue Sprache besser lernt, indem Sie kleine inkrementelle Schritte ausführen, würde ich die Verwendung von IronPython empfehlen . Verwenden Sie andernfalls reguläres CPython und führen Sie keine C # -Codierung mehr durch, bis Sie das Gefühl haben, Python zu verstehen.

Van Gale
quelle
4
Neben der fehlenden C # -Codierung hilft es auch, das Waschen und Rasieren zu beenden.
Alex
Würden Sie aufhören, Englisch zu sprechen, während Sie Chinesisch oder Japanisch lernen?
Teoman Shipahi
Guter Punkt. Ich werde Angular, Phalcon PHP, .NET Core und .NET MVC auf Eis legen, bis ich Python beherrsche. Stellen Sie Ihre Rasur auf einen Elektrorasierer, damit Sie dies tun können, während Sie sich Trainingsvideos ansehen - bis wir lernen können, wie Neo es getan hat ... "Ich kenne Jujitsu?"
Rich Bianco
2

Ich würde vorschlagen, einen guten Editor zu kaufen, damit Sie nicht von Leerzeichen gebissen werden. Der Einfachheit halber verwende ich nur die ActivePython-Pakete Link , die einen Editor und alle win32api-Bibliotheken enthalten. Es macht ziemlich viel Spaß, sich darauf einzulassen, wenn Sie C # verwendet haben. Das win32api in Python kann etwas einfacher sein. Sie müssen nicht die ganze DDLImport-Sache machen. Laden Sie ActivePython (das mit CPython geliefert wird) herunter, öffnen Sie es und geben Sie einige Dinge an der Konsole ein. Sie werden es ziemlich einfach lernen, nachdem Sie C # verwendet haben. Versuchen Sie für einige interessantere Python-Leckerbissen ActiveState-Code , der alle Arten von Rezepten enthält, mit denen Sie ganz einfach verschiedene Dinge sehen können, die Sie mit Python tun können.

jle
quelle
+1 - Die programmgesteuerte Installation von pywin32 ist fast unmöglich. Sie können es also genauso gut aus dem Weg räumen, wenn Sie Python installieren.
Jason Baker
Ich bin dankbar, das Licht am Ende des Tunnels zu sehen, bis ich nie wieder Windows brauche. So viele gute Alternativen zu .NET. Microsoft hat mit Windows 10 ein eigenes Grab gegraben. Ich war noch nie ein Fan von Linux, aber als es anfing, sich selbst zu zerstören, habe ich Zorin ausprobiert und zwei Wochen später hatte ich nicht den Wunsch oder die Notwendigkeit, Windoze zu starten.
Rich Bianco
2

Ich bin auch ziemlich in Ihren Schuhen und benutze immer noch C # für den größten Teil meiner Arbeit, aber Python immer mehr für andere Projekte.

@ e-satis kennt Python wahrscheinlich in- und auswendig und alle seine Ratschläge sind erstklassig. Aus meiner Sicht war das Folgende der größte Unterschied für mich:

Holen Sie sich wieder in Funktion. nicht unbedingt Spaghetti-Code, aber zu lernen, dass nicht alles in einem Objekt sein muss und sollte.

Der Dolmetscher. Es ist wie das unmittelbare Fenster, außer 10 ^ 10 besser. Aufgrund der Funktionsweise von Python benötigen Sie nicht das gesamte Gepäck und den Mist, den Sie mit C # eingeben müssen, bevor Sie die Dinge ausführen können. Sie können einfach in ein paar Zeilen schlagen und sehen, wie die Dinge funktionieren.

Normalerweise habe ich eine IDLE-Instanz eingerichtet, in der ich nur Schnipsel herumwerfe, während ich herausfinde, wie die verschiedenen Bits in der Sprache funktionieren, während ich meine Dateien bearbeite eine Liste, aber ich bin nicht 100% auf dem Lambda, das ich verwenden sollte ... schlagen Sie in ein paar Zeilen in IDLE, sehen Sie, wie es funktioniert und was es tut.

Und schließlich, die Verbosität von Python zu lieben, und das meine ich nicht in der langwierigen Bedeutung von Ausführlichkeit, sondern wie e-satis betonte, Verben wie "in", "ist", "für" usw.

Wenn Sie in C # viel nachgedacht haben, werden Sie weinen müssen, wenn Sie sehen, wie einfach das gleiche Zeug in Python ist.

Viel Glück damit.

RonaldHobbs
quelle
Reflexion ist ein Bereich des Punktnetzes, den ich mit ein paar Jahren Landerfahrung noch nicht vollständig erfasst habe. Mein Hauptfachgebiet ist PowerBuilder, das vollständig objektorientiert ist, einschließlich der Vererbung visueller Objekte. Ich hoffe, Python ist objektorientierter als das Punktnetz.
Rich Bianco
0

Und dann etwas, von dem Sie profitieren können:

IPython- Shell: Automatische Vervollständigung in der Shell. Es führt Stapeloperationen durch, fügt eine Menge Funktionen, Protokollierung und dergleichen hinzu. >>> Spiel mit der Muschel - immer!

easy_install / pip : So schön und einfach, eine Python-Anwendung eines Drittanbieters zu installieren.

Lakshman Prasad
quelle