Warum benötigt die Yield-Funktion in Python keine Klammern?

7

In Python habe ich oft die Funktion yield gesehen, die benutzt wurde, um einen Generator zu erzeugen. Sowohl diese Funktion als auch die Funktion print führen beide die Aktion von Methoden aus, da sie einen Wert zurückgeben. Beim Wechsel von Python 2 zu Python 3 erhielt die Funktion print jedoch Klammern wie bei einem normalen Methodenaufruf, die Ausbeute blieb jedoch gleich. Außerdem erhält yield eine gelbliche Farbe eines reservierten Schlüsselworts, während print das Purpur einer reservierten Methode ist. Warum wird yield nicht als Methode betrachtet und so eingefärbt, dass keine Klammern verwendet werden?

(Warum hat return in ähnlicher Weise auch keine Klammern?)

Lassen Sie mich noch etwas hinzufügen, yield und continue werden in vielen anderen Sprachen nicht mit Klammern versehen. Ich wollte nur wissen, was es anders macht, als es reserviert ist. Es gibt viele andere reservierte Methoden, die Klammern erhalten.

    
ytpillai 17.07.2015, 03:41
quelle

4 Antworten

15

Also habe ich nach einer Antwort gegraben. Und es stellt sich heraus, dass es eins gibt . Von PEP 255, dem Pep, der uns das Schlüsselwort yield gab

  

Q. Warum ein neues Keyword für "yield"? Warum nicht eine eingebaute Funktion?

     

A. Kontrollfluss wird viel besser über Schlüsselwort in Python ausgedrückt, und          Ausbeute ist ein Kontrollkonstrukt. Es wird auch als effizient erachtet          Die Implementierung in Jython erfordert, dass der Compiler dazu in der Lage ist          Bestimmen Sie mögliche Aufhängepunkte zur Kompilierzeit und eine neue          Stichwort macht das einfach. Die CPython Referenzimplementierung auch          nutzt es stark aus, um zu erkennen, welche Funktionen sind Generator-          Funktionen (obwohl ein neues Schlüsselwort anstelle von "def") das lösen würde          für CPython - aber Leute fragen das "warum ein neues Schlüsselwort?" Frage          will kein neues Schlüsselwort).

     

Q: Warum nicht eine andere spezielle Syntax ohne ein neues Schlüsselwort? Zum          Beispiel, eines davon anstelle von "yield 3":

%Vor%
  

A: Habe ich einen vermisst? Aus Hunderten von Nachrichten zählte ich drei          schlug eine solche Alternative vor und extrahierte das obige von ihnen.          Es wäre schön, kein neues Keyword zu benötigen, aber schöner, um Ertrag zu machen          sehr klar - ich möchte nicht folgern, dass eine Rendite ist          aus dem Sinn einer zuvor sinnlosen Folge von          Schlüsselwörter oder Operatoren. Wenn dies jedoch genügend Interesse weckt,          Befürworter sollten sich auf einen einzigen Konsensvorschlag und Guido festlegen          wird darauf aussprechen.

    
NightShadeQueen 17.07.2015, 03:50
quelle
7

print war keine Funktion, die Klammern erhielt: Es ging von einer Aussage zu einer Funktion über. yield ist immer noch eine Aussage, wie return . Die Syntaxhervorhebung ist spezifisch für Ihre Entwicklungsumgebung.

Weitere Informationen zu der Unterschied zwischen Ausdrücken und Aussagen hier und mehr über den Unterschied zwischen Funktionen und Aussagen hier . Siehe auch die Dokumentation zu einfachen Anweisungen und Verbindungsanweisungen .

    
TigerhawkT3 17.07.2015 03:43
quelle
2

yield ist keine Funktion, es ist ein Schlüsselwort und benötigt keine Klammern nach seine Grammatik -

  

yield_atom ::="(" yield_expression ")"

     

yield_expression ::="yield" [ausdruck_liste]

print war früher eine Anweisung in Python 2, wurde aber in Python 3 als integrierte Funktion mit PEP 3105

    
Anand S Kumar 17.07.2015 03:44
quelle
1

print war ein Schlüsselwort , definiert durch die Sprachspezifikation in Python 2 und wurde zu einer eingebauten Funktion (definiert durch die Standardbibliothek) Spezifikation) Python 3. yield war und ist immer noch ein Schlüsselwort .

    
Jonathon Reinhart 17.07.2015 03:44
quelle