Was sind einige Merkmale von Python, die es als seine eigene Sprache einzigartig machen? [geschlossen]

12

Was sind einige Merkmale von Python, die es als seine eigene Sprache einzigartig machen? Ich suche nach Eigenschaften, die von gut bis schlecht, von nützlich bis hinderlich, von der Syntax bis zur Verwendung in der Praxis reichen, aber für den durchschnittlichen Entwickler wären nicht undurchsichtige Beobachtungen am nützlichsten.

Ich bin ein Neuling hier, so dass intuitive Dinge möglicherweise erklärt werden müssen .....

John
quelle
9
Python ist nicht einzigartig, es enthält keine einzige einzigartige Funktion, die in keiner anderen Sprache zu finden ist.
SK-logic
10
Es ist die einzige Sprache, die ich kenne und die nach Monty Python benannt ist ...
yannis
Bei SK-logic geht es um Merkmale, von denen Merkmale eine Teilmenge sind. Gibt es keine Besonderheiten für Python?
Kojiro
@kojiro, ich habe noch nie eine formale Definition eines "Merkmals" gesehen, daher würde ich es vorziehen, nicht zu raten.
SK-logic
1
@kojiro, PL-Funktionen werden normalerweise sowohl als Syntax als auch als Semantik verstanden. Und beide sind formal definiert.
SK-logic

Antworten:

22

Es fällt Ihnen schwer, Funktionen zu finden, die absolut einzigartig sind . Die meisten vorhandenen Sprachmerkmale wurden seit ihrer Einführung in mehr als einer Sprache übernommen. Einige sind möglicherweise seltener, vor allem, weil sie entweder neu und noch im Dunkeln sind oder aus gutem Grund ausgestorben sind. Trotzdem ist es besser, wenn Sie sich Kombinationen von Funktionen ansehen.

Das heißt, mehrere Funktionen von Python sollten für eine relativ einzigartige Kombination sorgen. Zumindest kenne ich keine Sprachen, die in der Ferne populär (und praktisch) sind und deren Funktionsumfang sich größtenteils überschneidet. Wie in den Kommentaren erwähnt, ist Ruby ziemlich nah dran, aber es gibt dennoch zahlreiche Unterschiede.

  • Metaklassenbasierte Metaprogrammierung. Grundsätzlich Ausführen von Code für die Klassenerstellung. Sorgt für sehr nette Klasse Anpassung mit sehr wenig Arbeit am recieving Ende - zB für ein objekt-relationales Mapping (ORM), Client - Klassen können mit ein paar zusätzlichen Linien wie wie üblich geschrieben werden attr = SomeDataType()und eine Tonne Code wird automatisch generiert. Ein Beispiel dafür sind Djangos "Modelle" .
  • Sie werden aufgefordert, Iteratoren für alles zu verwenden . Dies zeigt sich insbesondere in 3.x, wo die meisten auf Listen basierenden Alternativen mit einem auf Iteratoren basierenden Äquivalent zugunsten des letzteren abgeschafft wurden. Iteratoren dienen auch als nahezu universelle Schnittstelle für Sammlungen (sowohl die, die Sie tatsächlich im Speicher haben, als auch die, die Sie nur einmal benötigen und daher mit den folgenden Funktionen erstellen). Sammlungsunabhängig, platzsparend ( O(1)Platz für Zwischenergebnisse folgt oft auf natürliche Weise, nur sehr wenige Aufgaben benötigen tatsächlich alle Elemente auf einmal). Die Zusammenstellung von Daten war noch nie einfacher.
  • Generatorausdrücke im Zusammenhang mit den oben genannten. Viele werden von Listenverständnissen gehört haben (Erstellen einer Liste aus einer anderen Iteration, Filtern und Zuordnen in diesem Prozess mit sehr praktischer Syntax). Vergiss sie, sie sind syntaktischer Zucker, ein Sonderfall. Generator-Ausdrücke sind syntaktisch sehr ähnlich und führen letztendlich zu der gleichen Reihenfolge von Elementen, aber sie führen zu schleppenden Ergebnissen (und belegen daher O(1)Platz, sofern Sie die Ergebnisse nicht explizit beibehalten).
  • yield, was hauptsächlich das Schreiben von Iteratoren (hier Generatoren genannt) viel schöner macht. Sie sind der große Bruder der oben genannten und unterstützen alle Arten von Kontrollabläufen. C # hat etwas Ähnliches mit dem gleichen Schlüsselwort. Es yieldist aber auch überlastet, um eine begrenzte Art von Coroutinen zu unterstützen (Lua zum Beispiel hat eine ausgefeiltere Unterstützung), die jedoch von klugen Leuten, die an schweren Problemen arbeiten, gut genutzt wurden. Zwei Beispiele aus dem Kopf: Rekursives Descent-Parsing mit Backtracing und ohne Stack-Limit sowie asynchrone E / A (mit praktischer Syntax).
  • Multi-Target-Zuordnung und iteratives Auspacken. Zuordnung zu Steroiden. Sie können nicht nur mehrere Werte gleichzeitig zuweisen (auch zum Austauschen von Werten und beim Iterieren - for key, value in mapping.items()), sondern auch alle Iterationen bekannter Länge (ehrlich gesagt, meistens Tupel) in mehrere Variablen packen. Seit 3.x ist es auch praktisch für die Sammlungen von unbekannter Länge , wie Sie ein paar Variablen nehmen einzelne Elemente und eine Aufnahme festlegen können , was bleibt: first, *everything_in_between, last = values.
  • Deskriptoren , wahrscheinlich die leistungsstärkste unter den verschiedenen Möglichkeiten, den Attributzugriff anzupassen. Es gibt Eigenschaften (wie in C #, jedoch ohne spezielle Sprachunterstützung), statische Methoden, Klassenmethoden usw., die alle als Deskriptoren implementiert sind. Sie sind auch erstklassige Objekte. Vor einer Woche war ich mit sich wiederholendem und kniffligem Code in Eigenschaften konfrontiert. Deshalb habe ich eine kleine Funktion geschrieben, die den sich wiederholenden Teil generiert und in ein properyObjekt einhüllt .
  • Reine Abseitsregel (Indentaion zur Begrenzung von Blöcken). Ich habe dies mit Absicht getan. Obwohl es Python auszeichnet, fällt es in der täglichen Programmierung nicht wirklich auf, wenn Sie daran gewöhnt sind (oder zumindest meine Erfahrung).
Gemeinschaft
quelle
Ich bin noch ein kleiner Neuling bei Ruby, aber ich denke, trifft alles außer dem letzten Punkt auch? So oder so bin ich damit einverstanden, dass "einzigartig" wahrscheinlich nicht in Python zu finden ist, aber "unter anderen Top-Sprachen nicht üblich" sein kann.
Rig
@Rig: Ich bin kein Ruby-Experte, aber ich habe weder Metaklassen gesehen (Ruby ist in Bezug auf Metaprogrammierung sicherlich genauso mächtig und kann es zu ähnlichen Zwecken verwenden, aber mein Eindruck war, dass es anders erreicht wird), noch Generatoren oder Generatorausdrücke (obwohl es scheinbar Koroutinen gibt), noch iterierbares Entpacken (es gibt jedoch eine Mehrzielzuweisung) oder Deskriptoren in Ruby. Ja, Ruby und Python überschneiden sich. Es gibt aber Unterschiede .
Gut, +1. Für mich ist "Zuweisung von Steroiden" eigentlich "Mustervergleich für arme Männer", aber trotzdem unglaublich nützlich :) Ich würde auch bemerken, wie flexibel die Parameterübergabe in Funktionen ist: *argsund **kwargs, schmerzlose Art, Tupel und Dikte auf Parameter abzubilden, usw .
9000
Ich bin der Meinung, dass das gemeinsame Lispeln mit CLOS alle Punkte betrifft, mit Ausnahme der Verwendung von layoutbasierter Syntax. Haskell ist nicht objektorientiert (obwohl es OO-Erweiterungen gibt), aber abgesehen vom Metaklassenpunkt, glaube ich, passt es zu all diesen Funktionen.
Jules
3

Ich denke, das einzige, was Python einzigartig macht, ist die spezielle Kombination der Funktionen, die es bietet. Dies gilt für die meisten Programmiersprachen.

Oder es gibt eine kleine Sache: Ich habe nicht gesehen, wie Python explizit selfals formaler Parameter an Objektelementfunktionen übergeben wird, die in einer anderen Sprache ausgeführt werden. Es ist eine kleine Sache, und ich verstehe nicht, wie dies wirklich etwas ändert.

Aber ich spreche nicht sehr fließend Python, es könnte also Dinge geben, die ich mit Sicherheit vermisse!

Torbjørn
quelle
@delnan: Ah, ich habe "explizit das Selbst als formalen Parameter übergeben" verpasst. Ich schätze , das ist, was ich um 2 Uhr morgens zum Lesen bekomme;)
Demian Brecht
4
Das explizite Selbst tritt auch in Oberon auf, fwiw
grrussel 30.12.11
Ein expliziter self-Parameter wird auch im allgemeinen lisp-Objektsystem verwendet. CLOS bietet jedoch mehrere Methoden, was bedeutet, dass der Parameter self in keiner Weise speziell ist, wie es in Python der Fall ist.
Jules
1

Die automatische Verarbeitung von Dokumentenstrings, um Eigenschaften ihres Besitzers zu werden. Im Allgemeinen machen alle brillanten Introspection-Funktionen von Python diese Sprache zu einer einzigartigen Sprache, von der Fähigkeit, help () zu verwenden, bis hin zur Fähigkeit, sie __doc__als erstklassige Eigenschaft eines Objekts zu verwenden. Beispielsweise:

>>> class DocStringException(Exception):
...     """Error message is the same as docstring"""
...     def __str__(self):
...         return repr(self.__doc__)
... 
>>> class ExampleException(DocStringException):
...     """An example happened"""
... 
>>> raise ExampleException
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.ExampleException: 'An example happened'

Weitere nützliche Funktionen zur Selbstbeobachtung:

  • help / help () - Hilfe mit dem Interpreter / Hilfe mit einem Objekt
  • keywords - Python-Schlüsselwörter
  • locals () - Liefert die lokalen Namen
  • globals () - Liefert die globalen Namen
  • dir () - Ruft die Eigenschaften und Methoden eines Objekts ab
  • die .mro Methode. , issubclass - Vererbung verstehen
  • id () - Liefert die Speicheradresse eines Objekts
Kojiro
quelle
Ruby hat so ziemlich die gleiche Kraft wie Common Lisp, Clojure und viele andere, meiner Meinung nach dynamische Sprachen.
Torbjørn
@Torbjørn welche macht das? Die automatische Dokumentation oder die Introspection-Funktionen?
Kojiro
Ich habe an beides gedacht. Nicht gerade das Sagen, aber im Geiste. Ich glaube nicht, dass Ruby die gleichen Dokumentationsfähigkeiten besitzt, aber mit Sicherheit Selbstbeobachtung. CL und Clojure haben beide Funktionen - und ich glaube, die Selbstbeobachtung geht weit über das hinaus, was Sie in Python finden, da sie homoikonisch ist .
Torbjørn,
1
  1. Generator Expressions
  2. input()Lassen Sie mich erklären, dass ich (bisher) keine Sprache gesehen habe, in der Sie einer Anweisung, die etwas druckt, einen Wert zuweisen können. Es ist wie bei Ruby print/gets, aber mit einem Wert, der dem Ausdruck zugewiesen ist, anstelle von:print "Foo" bar = gets
  3. yield
  4. Viele Arten von Datensätzen: ordereddict, namedtuple, array, list, tuple, dictionary
Billjk
quelle
Generatorausdrücke können in Haskell mithilfe von Listenverständnissen implementiert werden (Haskell-Listen sind im Gegensatz zu Python-Listen faul, sodass hierfür keine spezielle Syntax erforderlich ist). Mit "Eingabe" meine ich vermutlich die Python 3-Funktion dieses Namens (da die Python 2-Funktion gefährlich ist und nicht verwendet werden sollte). Es ist wahr, dass dies eine ungewöhnliche Kombination von Verhalten ist (obwohl es in Javascript - window.prompt - und BASIC vorhanden ist, von wo ich es aus Python entlehnt habe), aber es kann vom Programmierer trivial implementiert werden ("input s =") putStrLn s >> getStrLn "erledigt dies für haskell).
Jules
Eine faule Sprache wie Haskell braucht eigentlich keinen Ertrag - sie kann einfach eine Liste zurückgeben, die mit den üblichen Methoden erstellt wurde, und Artikel werden auf Anfrage generiert. Trotzdem enthält die Bibliothek eine explizite Implementierung von Coroutinen. Die Haskell-Standardbibliothek enthält alle genannten Datenstrukturen und vieles mehr.
Jules
-2

Die Sache ist, Python gehört zu den wenigen Sprachen mit extrem geringem syntaktischen Aufwand, was ihm enorme Ausdruckskraft verleiht: Listen- / Mengen- / Diktierverständnisse, Ausbeute, Dekoratoren, Auswertung, Metaklassenprogrammierung, Selbstbeobachtung, die optimierten eingebauten Datenstrukturen (Listen, diktiert, setzt), all diese Dinge verschwören sich auf eine sehr nette Art und Weise, um Ihnen (dem Entwickler) die Möglichkeit zu geben, Ihre Gedanken in prägnantem und elegantem Code fast so schnell auszudrücken, wie Sie denken können. Ich kann mir keine andere Sprache vorstellen, in der diese tollen Funktionen zusammenkommen.

Rabih
quelle
1
Was halten Sie von Schema, wenn Sie glauben, dass Python einen geringen syntaktischen Aufwand hat (trotz einer obszön komplizierten Grammatik und einer relativ großen Menge Syntaxzucker)?
Tikhon Jelvis
Eval sollte wirklich nicht für ein Produktionsprogramm verwendet werden (obwohl es meiner Meinung nach für schnelle Hacks nützlich sein kann). Wie in den Kommentaren zu anderen Fragen gezeigt, ist Python in diesen Funktionen keineswegs einzigartig. Ich glaube zum Beispiel, dass Clojure alle Funktionen hat, die Sie auflisten, und die meisten können mit normalem Lisp gemacht werden.
Jules
-4

Ich würde sagen, es wird Einrückung verwendet, um if-Anweisungen und Schleifen einzuschließen. Habe das in keiner anderen Sprache gesehen.

Ich denke, es ist sehr praktisch, weil es erheblich schwieriger ist, Python-Code zu verschleiern!

Es scheint auch ordentlich Zeile für Zeile zu funktionieren, mit Ausnahme von Funktionen, und es kann auch als solches interpretiert werden, was nett ist.

Liang
quelle
2
Wikipedia kennt auch einen Bildschirm voller Sprachen. Es heißt die Abseitsregel .
3
Ich verstehe nicht. Es scheint auch ordentlich Zeile für Zeile zu funktionieren, mit Ausnahme von Funktionen, und es kann auch als solches interpretiert werden, was nett ist. Was bedeutet es?
Kojiro