Java Entwickler lernen Python: Welche Konzepte brauche ich, um meinen Kopf herumzukrempeln?

38

Hintergrund: Ich habe ein paar Tutorials durchgearbeitet und einige kleine Projekte geschrieben. Mit Google und StackOverflow läuft alles gut genug .

In den letzten Tagen habe ich mich mehrmals gefragt: "Was fehle ich?" - Ich habe das Gefühl, dass ich immer noch in Java denke, während ich in Python schreibe.

Diese Frage bei StackOverflow enthält viele Tipps, welche Ressourcen Sie zum Erlernen von Python lesen sollten, aber ich habe immer noch das Gefühl, dass ich ein Java-Entwickler mit einem Wörterbuch (ohne Wortspiel) bin, das in Python übersetzt werden soll.

Was ich wirklich tun möchte, ist meinen Kopf neu zu gestalten, um Pythonic Python anstelle von Java, das als Python getarnt ist, schreiben zu können, ohne meine Java-Kenntnisse zu verlieren.

Der Kern meiner Frage lautet also: Welche Konzepte muss ein Java-Entwickler wirklich lernen, um Pythonic zu denken? Dies schließt alles ein, was verlernt werden muss.

Hinweis: Ich frage nach Sprachkonzepten, nicht nach der Sprachsyntax.

LRE
quelle
9
Lassen Sie die Idee los, dass das Programmieren schwierig sein soll.
Job

Antworten:

40

Ein paar Punkte zusätzlich zu dem, was bereits gesagt wurde:

  • Python ist dynamisch. Die Erstellung einer Klasse ist eine ausführbare Anweisung , ebenso wie der Import eines Moduls. es kann bedingt gemacht werden. Eine Klasse kann nach der Erstellung geändert werden. Dies ermöglicht eine einfache Metaprogrammierung und AOP.

  • Es gibt keine Schnittstellen. Ente Tippregeln. Wenn Sie sie dringend brauchen, gibt es 'abstrakte Basisklassen (ABCs)', aber normalerweise verpassen Sie keine Schnittstellen, da es sowieso keine statische Typprüfung gibt.

  • Obwohl alles ein Objekt ist, stehen Funktionen vor Objekten. Es ist vollkommen in Ordnung, nur Funktionen (und keine Klassen) in einem Modul zu haben.

  • Alles ist eine erstklassige Einheit. Funktionen als Parameter übergeben, zurückgeben und Variablen zuweisen ist die Norm. Das Gleiche gilt für den Unterricht. Methoden sind nur Funktionen; Sie können eine Instanzmethode wie eine normale Funktion behandeln, sie weitergeben usw.

  • Verwenden Sie integrierte Befehle, Mengen, Listen und Tupel. Listen und Befehle können geändert werden, Tupel nicht. Alle von ihnen sind sehr effizient und syntaktisch prägnant. Gewöhnen Sie sich daran, mit einem Tupel mehrere Werte aus einer Funktion zurückzugeben (Sie brauchen nicht einmal Klammern). Gewöhnen Sie sich daran, komplexe Hierarchien von sehr einfachen Objekten durch Apparaturen aus einfachen Listen, Tupeln und Dikten ('Hashtabellen') zu ersetzen. Dies vereinfacht das Leben.

  • Python bietet einiges an FP-Unterstützung. Listenverständnis lernen und dann Iteratoren und Generatoren. Diese helfen sehr.

  • Alle Operatoren können durch das Definieren geeigneter Methoden überladen werden, sodass durch Hinzufügen oder Vergleichen alles zurückgegeben werden kann, was Sie möchten. Denken Sie daran, dass Sie mit SQLAlchemy arbeiten.

  • Es gibt keine Null, nur Keine, ein vollwertiges Objekt. Sie können None ganz gut ausdrucken usw. Wenn None übergeben wird, wenn eine andere Instanz erwartet wird, führt dies normalerweise zu einem AttributeError, nicht zu einer NPE, manchmal weiter unten in der Ausführungspipeline.

  • Aufgrund der vollen Dynamik von Python gibt es praktisch keine statischen Überprüfungen . Sie können auf einen Namen verweisen, der in Ihrem Programm nie existiert (z. B. ein Tippfehler), oder nur in einem bestimmten Ausführungspfad definiert werden, und nichts wird Sie daran erinnern, bis die Ausführung tatsächlich auf diesen Verweis trifft und ein NameError ausgelöst wird. Gehen Sie vorsichtig mit dem Umfang Ihrer Variablen um und schreiben Sie weitere Komponententests.

  • Aufgrund der vollen Dynamik von Python sind Objekte fast immer formbar. Normalerweise können Sie Felder und Methoden sogar zu einer Instanz hinzufügen und so versehentlich ihren Status oder Methodensatz löschen oder überschreiben. Seien Sie vorsichtig beim Zuweisen von Attributen. Dadurch ergeben sich auch interessante Möglichkeiten :)

  • Es gibt keine symbolischen Konstanten , nur Variablen. Stellen Sie sicher, dass Sie nicht versehentlich eine 'Konstante' überschreiben. Wenn Sie sicher sein möchten, dass Sie eine Konstante nicht überschreiben können, verwenden Sie eine Funktion oder eine Eigenschaft (bei der es sich um eine verschleierte Funktion handelt).

  • Pythons Threads eignen sich für die E / A-gebundene Verarbeitung, nicht jedoch für die CPU-gebundene. Versuchen Sie nicht, eine Rechenaufgabe zu beschleunigen, indem Sie sie in parallelen Threads ausführen.

9000
quelle
+1 sehr gute Punkte. Nitpicking: NoneNormalerweise verursacht AttributeError(aber spielt keine Rolle, normalerweise braucht man es sowieso nicht) und Sie können (und sollten in einigen Fällen) unveränderliche Objekte schreiben (z namedtuple. B. durch ).
@danlan: danke, ich habe den text korrigiert :) ja, du kannst unveränderliche objekte erstellen. Objekte, die Sie im Allgemeinen erstellen, indem Sie eine reguläre Klasse und dann Instanzen davon erstellen, sind jedoch sehr veränderlich, es sei denn, Sie treffen eine Reihe besonderer Maßnahmen. Die Tatsache, dass die Zuweisung zu einem undefinierten Instanzattribut es normalerweise unbemerkt definiert, anstatt einen Fehler zu verursachen, kann für einen Java-Programmierer eine Überraschung sein.
9000
1
Python (und andere FP-Sprachen) ersetzt die ausführlichere Codebildung einfacherer Bausteine ​​durch kompakten Code, der auf komplexeren Bausteinen aufbaut. Denken Sie an RISC vs. CISC-Prozessoren.
Paul
1
Ich würde den Datenstrukturen Mengen hinzufügen.
Sakisk
2
Vor etwas mehr als 3 Jahren habe ich diese Frage gestellt. Ich muss sagen, dass dieser Rat sehr gut standgehalten hat.
LRE
14

Lesen Sie diesen Artikel: Python ist nicht Java . (Außerdem sind die meisten anderen Artikel in der Seitenleiste lesenswert, auch wenn sie sich nicht auf Java beziehen.) Der Artikel gibt einige gute Hinweise, wie Java-Programmierer Python unbeabsichtigt missbrauchen können (und wie man es nicht tut).

Zyklop
quelle
6
"XML ist nicht die Antwort." - das geht weit über Java v Python hinaus ;-)
LRE
3

Ich bin von Java zu Python gewechselt und eines der nützlichsten Dinge, die ich fand, war das Testen von Code über den Befehlszeileninterpreter. Geben Sie python in die Befehlszeile ein und führen Sie Ihren Code von dort aus aus, bis Sie es richtig verstanden haben.

Frameworks waren in Python auch etwas weniger definiert. Es gibt 10s von Web-Frame-Arbeiten nur für den Anfang. Django ersetzt mehr oder weniger Spring und SQL Alchemy für Hibernate.

Bassdread
quelle
2

Eine wichtige Sache wäre, die dynamische Eingabe zu verstehen. Zum anderen sind Objekte veränderlich und öffentlich. Zumindest anfangs ist die Namensbindung gegenüber Variablen weniger wichtig.

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

Hier verweisen myjobtitle und der Wert von job.title auf dasselbe Objekt. Dem Klassenattribut job.startDate wurde zuerst eine Zeichenfolge und dann ein Zeitobjekt zugewiesen. Und währenddessen können die Jobinstanz und sogar die Klasse selbst dynamisch geändert werden.

Arcege
quelle
1

Vielleicht möchten Sie auch einen Blick auf Jython werfen . Es unterstützt möglicherweise nur Python 2.5, aber wir finden es sehr leistungsfähig, in der Lage zu sein, Prototypen mit Python schnell zu erstellen und diese später bei Bedarf in Java neu zu schreiben.

Basierend auf meiner Antwort auf Was muss ich beim Wechsel von Python zu Java beachten? da diese Frage jetzt als Duplikat geschlossen wurde!

Mark Booth
quelle