2016-03-29 7 views
1

Ich frage mich, wie Sie den Bereich() Funktion in Python 2.7 ist in der Lage eine Syntax zu haben, wie:Order of range() Argumente in Python

range(start, stop[, step]) 

als eine Funktion in Python Erstellung der optionalen Argumente erfordert zu sein am Ende der Parametereingaben, wie in:

function(a, b, c=1) 

(aus irgendeinem Grunde kann ich die Datei nicht finden, in welchem ​​Bereich() so erklärt ...) Aber es ist möglich, nur eine Eingabe single (stop) Ganzzahl wie in range(10)

Verwendet die Reihe dann ein Konstrukt wie das untenstehende? Oder gibt es einen eleganteren Weg, dies zu tun?

Mit den folgenden Testfällen erhalten wir ein (scheinbar) ähnliches Ergebnis wie bei der Verwendung einer Bereichsfunktion.

print TestRange(6) 
print TestRange(2, 6) 
print TestRange(2, 6, 2) 
+0

Python 2 oder 3? In Python 3 gibt 'range' keine Liste zurück, sondern gibt ein' range' Objekt zurück. Ein Generator wäre für eine Python 3-Version (oder Python 2 'xrange') geeignet. – cdarke

+0

Ich habe das ausprobiert und bin zu dem Schluss gekommen, dass das Erstellen einer Funktion in Python die optionalen Argumente am Ende der Parametereinträge benötigt, wie in' function (a, b, c = 1) '. Als 'Funktion (a = 1, b, c = 1)' ist nicht erlaubt. –

Antwort

2

einen Blick auf den Quellcode nehmen range für (dies ist die range_new-Funktion): https://github.com/python/cpython/blob/d741c6d3179b771cec8d47c7b01dd48181b7717e/Objects/rangeobject.c#L79

if (PyTuple_Size(args) <= 1) { 
    if (!PyArg_UnpackTuple(args, "range", 1, 1, &stop)) 
     return NULL; 
    stop = PyNumber_Index(stop); 
    if (!stop) 
     return NULL; 
    start = PyLong_FromLong(0); 
    if (!start) { 
     Py_DECREF(stop); 
     return NULL; 
    } 
    step = PyLong_FromLong(1); 
    if (!step) { 
     Py_DECREF(stop); 
     Py_DECREF(start); 
     return NULL; 
    } 
} 
else { 
    if (!PyArg_UnpackTuple(args, "range", 2, 3, 
          &start, &stop, &step)) 
     return NULL; 

    /* Convert borrowed refs to owned refs */ 
    start = PyNumber_Index(start); 
    if (!start) 
     return NULL; 
    stop = PyNumber_Index(stop); 
    if (!stop) { 
     Py_DECREF(start); 
     return NULL; 
    } 
    step = validate_step(step); /* Caution, this can clear exceptions */ 
    if (!step) { 
     Py_DECREF(start); 
     Py_DECREF(stop); 
     return NULL; 
    } 
} 

Es ist im Wesentlichen der gleiche Ansatz wie in Ihrem TestRange, obwohl Sie TestRange(stop, step=3) Sie tun können, aber kann nicht tun range(stop, step=3), weil das letzte Argument zu range ist eigentlich kein Schlüsselwort arg.