Wie kann die eingebaute Bereichsfunktion ein einzelnes Argument oder drei Argumente annehmen?

8

Ich würde gerne wissen, ob mir jemand sagen kann, wie die Bereichsfunktion entweder ein einzelnes Argument, range(stop) , oder range(start, stop) oder range(start, stop, step) annehmen kann. Verwendet es ein Argument variadic wie *arg , um die Argumente zu sammeln, und verwendet dann eine Reihe von if-Anweisungen, um die richtigen Werte abhängig von der Anzahl der gelieferten Argumente zuzuweisen? Im Wesentlichen gibt range() an, dass wenn es ein Argument gibt, es als Stopp-Argument gesetzt wird, oder wenn es zwei gibt, dann sind es start und stop , oder wenn es drei gibt, dann setzt es diese als stop , start bzw. step ? Ich würde gerne wissen, wie man das machen würde, wenn man in reinem Cpython Range schreiben würde. Danke !!!

Aktualisieren : Als ich die Frage gestellt habe, habe ich nicht geklärt, dass ich die Antwort in Cpython wissen wollte. Trotzdem vielen Dank für all Ihre Antworten! Ich fand sie alle ziemlich aufschlussreich. Dies ist die Art von Feedback, die mich dazu bringt, Stackoverflow und die Leute, die es so besonders machen, zu lieben!

    
MWGriffin 13.11.2012, 18:12
quelle

3 Antworten

4

Bereich nimmt 1, 2 oder 3 Argumente. Dies könnte mit def range(*args) und explizitem Code implementiert werden, um eine Ausnahme auszulösen, wenn sie 0 oder mehr als 3 Argumente erhält.

Es konnte nicht mit Standardargumenten implementiert werden, da Sie nach einem Standard, z. %Code%. Dies liegt im Wesentlichen daran, dass Python herausfinden muss, was jeder Aufruf bedeutet. Wenn Sie also mit zwei Argumenten aufrufen würden, würde Python eine Regel benötigen, um herauszufinden, welches Standardargument Sie überschreiben würden. Anstatt eine solche Regel zu haben, ist es einfach nicht erlaubt.

Wenn Sie Standardargumente verwenden möchten, könnten Sie etwas wie: def range(start=0, stop, step=1) machen und eine explizite Überprüfung des Typs von def range(start=0, stop=object(), step=1) vornehmen.

    
Marcin 13.11.2012, 18:16
quelle
5

Das Schöne an Open-Source-Software ist, dass Sie einfach in der Quelle :

(TL; DR: ja, es verwendet varargs)

%Vor%     
lqc 13.11.2012 18:22
quelle
2

Die Antwort von lqc zeigt, wie range in C implementiert ist. Sie könnten immer noch neugierig sein, wie range dies tun würde implementiert werden, wenn Pythons eingebaute Funktionen in Python geschrieben wurden. Wir können PyPys Quellcode lesen, um es herauszufinden. Von pypy/module/__builtin__/functional.py :

%Vor%

Das erste Argument, space , erscheint als Argument in allen eingebauten Funktionen, die ich gesehen habe, also vermute ich, dass es irgendwie wie self ist, da der Benutzer es nicht direkt liefert. Von den verbleibenden drei Argumenten haben zwei von ihnen Standardwerte; Sie können also range mit einem, zwei oder drei Argumenten aufrufen. Wie jedes Argument interpretiert wird, hängt davon ab, wie viele Argumente angegeben wurden.

    
Kevin 13.11.2012 18:57
quelle

Tags und Links