Wie kann ich lernen, effektiv Pythonic-Code zu schreiben?

46

Eine Google-Suche nach "pythonic" zeigt eine Vielzahl von Interpretationen. Die Wikipedia-Seite sagt:

Ein verbreiteter Neologismus in der Python-Community ist Python, der eine Vielzahl von Bedeutungen im Zusammenhang mit dem Programmstil haben kann. Zu sagen, dass Code pythonisch ist, bedeutet, dass er Python-Redewendungen gut verwendet, natürlich ist oder fließend in der Sprache spricht. Wenn Sie von einer Benutzeroberfläche oder einem Sprachfeature sagen, dass es pythonisch ist, bedeutet dies, dass es gut mit Python-Idiomen zusammenarbeitet und dass seine Verwendung gut mit dem Rest der Sprache harmoniert.

Es wird auch der Begriff "unpythonisch" behandelt:

Im Gegensatz dazu besteht ein Zeichen für unpythonischen Code darin, dass versucht wird, C ++ - (oder Lisp-, Perl- oder Java-) Code in Python zu schreiben. Das Konzept der Pythonität ist eng mit Pythons minimalistischer Philosophie der Lesbarkeit verbunden und vermeidet den Ansatz, dass es mehr als einen Weg gibt, dies zu tun. Unlesbarer Code oder unverständliche Redewendungen sind unpythonisch.

Was bedeutet der Begriff "pythonisch"? Wie lerne ich, es in der Praxis effektiv anzuwenden?


quelle
6
Ich denke, Ihre Frage kann auf jede Programmiersprache ausgeweitet werden. Es gibt immer eine empfohlene Art der Programmierung, die in einer großen Anzahl von Fällen genau sein kann und auch die Revision, Lesbarkeit und Wartung verbessert. Ich denke, auch wenn man diese Empfehlungen in Frage stellt, kann sich eine Sprache weiterentwickeln und verbessern ...
Amine,
@ Mine so wahr. Eigentlich denke ich, dass ein Community-Wiki in Betracht gezogen werden sollte, in dem genau festgelegt wird, wo man - für alle Sprachen - Sprachwörter lernen kann.
Yati Sagade
Möglicherweise verwandt: programmers.stackexchange.com/questions/47860/…
FrustratedWithFormsDesigner
1
Kommentatoren : Bitte hört auf, irrelevante Kommentare zu posten. Sie wurden aus einem bestimmten Grund gelöscht. Wenn Sie eine Antwort haben, lassen Sie sie als Antwort. Wenn Sie das Thema dieser Frage diskutieren möchten, verwenden Sie bitte den Chat .
1
Durch das Üben von Python!
Dynamische

Antworten:

22

Ich habe herausgefunden, dass die meisten Leute ihre eigenen Interpretationen von dem haben, was "Pythonic" wirklich bedeutet. Aus Wikipedia:

Ein verbreiteter Neologismus in der Python-Community ist Python, der eine Vielzahl von Bedeutungen im Zusammenhang mit dem Programmstil haben kann. Zu sagen, dass Code pythonisch ist, bedeutet, dass er Python-Redewendungen gut verwendet, natürlich ist oder fließend in der Sprache spricht. Wenn Sie von einer Benutzeroberfläche oder einem Sprachfeature sagen, dass es pythonisch ist, bedeutet dies, dass es gut mit Python-Idiomen zusammenarbeitet und dass seine Verwendung gut mit dem Rest der Sprache harmoniert.

Im Gegensatz dazu besteht ein Zeichen für unpythonischen Code darin, dass versucht wird, C ++ - (oder Lisp-, Perl- oder Java-) Code in Python zu schreiben. Das Konzept der Pythonität ist eng mit Pythons minimalistischer Philosophie der Lesbarkeit verbunden und vermeidet den Ansatz, dass es mehr als einen Weg gibt, dies zu tun. Unlesbarer Code oder unverständliche Redewendungen sind unpythonisch.

Ich habe festgestellt, dass mehr als einmal "pythonische" Beispiele tatsächlich von Leuten stammen, die versuchen, mit Python-Redewendungen klug umzugehen und (wieder mehr als einmal) ihren Code praktisch unlesbar zu machen (was nicht Pythonisch ist).

Solange Sie sich an Pythons Redewendungen halten und vermeiden, C ++ - (oder andere Sprach-) Stile in Python zu verwenden, sind Sie Pythonisch.

Wie von WorldEngineer hervorgehoben, ist PEP8 ein guter Standard, dem zu folgen ist (und wenn Sie VIM verwenden, gibt es Plugins für das Flusen von PEP8).


Wirklich aber, am Ende des Tages, wenn Ihre Lösung funktioniert und nicht absolut schrecklich wartungsfrei und langsam ist, wen interessiert das? Meistens ist es Ihre Aufgabe, eine Aufgabe zu erledigen und nicht den elegantesten, pythonischsten Code zu schreiben, der möglich ist.


Noch eine Randbemerkung (meiner Meinung nach kann ich das gerne ablehnen;)): Ich habe auch festgestellt, dass die Python-Community mit einer Menge Ego gefüllt ist (nicht, dass es die meisten Communities nicht sind , es ist nur ein bisschen weiter verbreitet) in Communities wie C und Python). Wenn man also das Ego mit falsch interpretierten Interpretationen von "pythonisch" kombiniert, ergibt sich eine Menge unbegründeter Negativität. Nimm, was du von anderen liest, mit einem Körnchen Salz. Halten Sie sich an offizielle Standards und Dokumentationen, und alles wird gut.

Demian Brecht
quelle
2
+1 für eine nette Antwort (mit Ausnahme des Zitats, da ich es im OP verwendet habe).
Ugh .. Sollte das OP noch einmal durchlesen, bevor das Zitat veröffentlicht wird: P
Demian Brecht
3
Vielmehr besteht eine starke Korrelation zwischen Ego und Online-Aktivität, bei der Meinungen in jeder Community geäußert werden . Grundsätzlich sieht man die nicht egoistischen Leute nicht so oft, weil sie überhaupt nicht so viel schreiben.
isarandi
17

Pythonic ist in Python idiomatisch zu codieren. Es bedeutet, Strukturen und Formatierungen zu verwenden, die für Python vom Standpunkt der Programmierung, aber auch vom Standpunkt des Community-Lesens aus gut funktionieren. Es ist sehr ähnlich, wie K & R lange Zeit den Standard für C-Programmierstile gesetzt hat. Diese Anleitung zeigt, dass Sie in Python idiomatisch codieren müssen. In diesem Handbuch wird auf PEP 8 verwiesen, sodass es sich wahrscheinlich lohnt, es zu lesen.

Weltingenieur
quelle
1
@MattFenwick Sind das nicht 90% von dem, worum es beim Programmieren geht? Gute Programmierer verbringen viel Zeit damit, Code zu lesen und in der verbleibenden Zeit viel Code zu schreiben. Je mehr Pythonic-Code Sie lesen und je mehr Sie in Python schreiben, desto pythonischer wird Ihr Code. Ich glaube nicht, dass es hier Abkürzungen gibt.
Kris Harper
2
Hervorragender Link!
Ethan Furman
13

Schreiben von "Pythonic" -Code IMHO nutzt die (V) HLL-Funktionen der Sprache nur effektiv aus. Als allgegenwärtiges Beispiel

x, y = 7, 'fuhrer'

Das ist sehr pythonisch. Ich erinnere mich, als ich nach Monaten nur mit Python anfing, C # zu lernen,

int x, y = 10, z;

Irgendwie hat mich das verwirrt, aber es dauerte eine Minute, bis ich zu meinen C / C ++ - Wurzeln zurückgekehrt war.

Ein anderer pythonischer Weg ist die Verwendung von Lambdas.

l = [1, 2, 3, 4, 5]
print(sorted(l, key=lambda x: -x))

wird tatsächlich lin absteigender Reihenfolge gedruckt .

Dann gibt es das sehr viel benutzte, aber weniger verstandene "Entenschreiben" - Wenn es wie eine Ente geht und spricht, behandelt man es wie eine Ente. Dies hängt eng mit Schnittstellen in anderen OO-Sprachen zusammen.

Gegebenenfalls werden auch funktionale Programmiermethoden wie Map und Reduce als pythonisch betrachtet.

Beim Tippen wurde eine Antwort gepostet, die einen netten Link enthält. PS: Es ist nicht so, dass Ihr Wissen über Python begrenzt ist. Ich kann wetten, dass Python nicht Ihre Muttersprache war, und daher müssen Sie (wie die meisten von uns Pythonisten) lernen, mit der Schlange "idiomatisch" zu werden! Prost!

Yati Sagade
quelle
Ich habe den Link nicht eingefügt, da er bereits beim Tippen gepostet wurde - die Antwort von WorldEngineer :) Denken Sie nur daran, die Sprachfunktionen für Ihr Wohl und das anderer auszunutzen, und Sie erhalten Pythonic auf dem Weg, und folgen
Yati Sagade
4
Eigentlich viele Streitigkeiten , die map, reduce, lambdaund so sind idiomatische per se. Listenverständnis und Generatorausdruck sind eine Alternative, und viele bevorzugen sie, wann immer dies vernünftigerweise möglich ist (insbesondere sind sie weniger laut, wenn Sie ohnehin ein Lambda benötigen). Sie haben sicherlich ihre Verwendung, und funktionale Programmierung zeigt sich in anderen Redewendungen (zum Beispiel Dekorateur).
@delnan war sich einig - und das umso mehr, wenn es um Python 3 geht. Fazit: Die Funktionsmerkmale sollten genau dort eingesetzt werden , wo sie benötigt werden. Und das (es gibt nur einen offensichtlichen Weg) ist idiomatisch :)
Yati Sagade
Persönlich habe ich die Vorlieben der Leute für Ihr erstes Beispiel nie verstanden. Das ist viel einfacher im Kopf zu analysieren (das ist das Zen von Python, Code wird häufiger gelesen als geschrieben): (x, y) = (7, 'fuhrer')- Ich werde jedoch fast immer "korrigiert", dass es der beste Weg ist, ihn ohne Parens zu schreiben!
Izkata
2
Ich würde argumentieren, dass Ihr spezielles Sortierbeispiel nicht pythonisch ist. Warum mit einem Lambda die Nachbestellung wieder einführen, wenn Sie nur können print(sorted(l, reverse=True)), was dem Leser zusätzlich explizit mitteilt, was los ist? Ich würde auch Ihr erstes Beispiel für umstritten halten. Es sind zwei Aufgaben, die zu einer zusammengefasst sind. Es ist okay, aber ich würde es nicht als sehr pythonisch bezeichnen. Die Leser müssen sich länger damit auseinandersetzen als mit zwei Aufgaben.
Phresnel
7
--> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Der pythonische Code lautet:

  • Lesbar
  • Einfach (so einfach wie möglich, aber nicht einfacher)
  • Gut durchdacht
Ethan Furman
quelle
1
+1. Das Zen of Python ist für das Schreiben von Python-Code wichtiger als das Befolgen einer Liste von Redewendungen. Letzteres wird nicht alle Umstände abdecken.
Doval
6

Jedes Mal, wenn ich versucht habe, eine neue Sprache zu lernen, habe ich festgestellt, dass das Lesen von Code durch Leute, die die Sprache wie ihre Westentasche kennen, nach etwas suchen / fragen, das komisch aussieht, und dann versuchen, ihren Stil zu imitieren, das ist das Beste, was zu tun ist. Beispiele:

In Python fand ich die Beispiele von Dive Into Python unglaublich nützlich, um loszulegen , da wir uns mit diesem Thema befassen. Sie neigen dazu, nicht nur die Grundlagen von Python zu vermitteln, sondern auch das idiomatische Python zu betonen .

Als ich D lernte, lernte ich, da die Dokumentation zu der Zeit nicht großartig war, weil die Sprache so blutig war, indem ich den Code in der Standardbibliothek las, insbesondere einige von Andrei Alexandrescus Meisterwerken .

Als ich C ++ lernte, erbte ich eine Codebasis von einem ziemlich guten C ++ - Programmierer und lernte viel über die idiomatische C ++ - Programmierung, indem er darauf bestand, STL-Container als Referenz weiterzugeben usw.

In allen Sprachen finde ich, dass das Durchsuchen der StackOverflow-Fragen zur Sprache und das Hinschauen auf die typischen Schritte zur Erledigung grundlegender Aufgaben hilfreich ist.

dsimcha
quelle
+1 Wenn Sie die Grundlagen einer Sprache kennen, hilft das Lesen von Code weitaus mehr als das Lesen von Büchern.
Schritt
3

Python ist nicht Java und kann Ihnen nützliche Ratschläge geben. Ich kann nicht mehr sagen, ohne zu wissen, auf welche Art von Problemen Sie stoßen, aber es ist ein sehr konkreter Ratschlag für Programmierer, die aus einer anderen Sprache (in diesem Fall speziell Java) stammen und wissen, wie man Python anders macht.

maxpolun
quelle
2

Jemand sagte zu paraphrasieren, um zu lernen, was Pythonic ist, schlagen Sie einfach etwas Code aus. Dem stimme ich nicht zu. Wenn Sie sehr dichten Code schreiben möchten, wird er dadurch nicht pythonischer.

Eine Möglichkeit, Ihnen bei der Definition von Pythonic zu helfen, ist die Frage, warum ich (dh Sie) die Python-Sprache verwende. Was reizt dich daran?

Für mich ist es Lesbarkeit und fehlende Kompilierung und Open Source (so ziemlich alles). Ich kann Tonnen von Bibliotheken herunterladen und ihren Quellcode mit weniger Stress bei der Lizenzierung lesen als viele andere Sprachen.

Für mich ist Python optisch wunderschön. Guido (der Schöpfer von Python) beweist mir auch immer wieder durch seine Antworten in PEPS und Diskussionen, dass seine Entscheidungen, wie er die Sprache gemacht hat, meinen eigenen Vorstellungen, wie sie hätte entstehen sollen, überlegen sind.

Ein großartiger Programmierer ist für mich jemand, der über sehr fundierte Entscheidungsfähigkeiten beim Codieren verfügt. Für mich hilft Python dabei, diese Entscheidungen schnell zu treffen.

Indem Sie die Syntax des Quellcodes vereinfachen, indem Sie Enten-Typisierung anstelle von explizidem Typ-Casting zulassen, und die Erwartung, dass sich Codierer, die Ihren Code überprüfen, "gut benehmen sollten", zu etwas führen, das ich auch "Pythonic" nenne

Es gibt also zwei Seiten von Pythonic. Das eine ist syntaktisch, das andere ist die Praxis von. Wie erklärt man die tiefere Seite von "Pythonic"?

In Python ist es keine große Sache, dies zu tun: alist = ['eins', 'zwei', 'drei \ n'] alist.append ((1234, 'Atuple'))

und das Tupel wird ohne Rücksicht auf die Objekttypen zur Liste hinzugefügt. Der Pythonic-Teil ist nicht, dass Sie dies tun KÖNNEN, sondern dass Ihr Code dies ERWARTEN und einfach arbeiten / anpassen sollte.

Was auch immer an dem -alist- -Objekt funktioniert, sollte mit der Idee geschrieben werden, dass ein anderer Codierer hereinkommen und einen Nicht-String zur Liste hinzufügen könnte und dass die Anpassung des Quellcodes durch den neuen Codierer nicht schwierig sein sollte. Das ist doch der Vorteil von ducktype.

DevPlayer
quelle
-2

Kaufen Sie ein empfohlenes Buch. Lies es. Es sollte Ihnen eine gute Grundlage für die Verwendung der Sprache und einen Mechanismus bieten, der dem Community-Stil entspricht

Paul
quelle