2016-03-29 28 views
1

我在Python 2.7琢磨着怎麼範圍()函數能夠有一個語法,如:訂單在python範圍()參數

range(start, stop[, step]) 

在創建Python中的函數需要可選參數是在參數項目的結束,如:

function(a, b, c=1) 

(由於某種原因,我無法找到哪個範圍()聲明,因此文件...) 但它有可能只是一個進入單個(停止)整數如range(10)

範圍然後使用一些像下面的結構?還是有更好的方法來做到這一點?

def TestRange(start, stop = None, stepSize = 1): 
    if stop == None: 
     d = 0 
     TrackTest = [] 
     while d < start: 
      TrackTest += [d] 
      d += stepSize 
     return TrackTest 
    else: 
     d = start 
     TrackTest = [] 
     while d < stop: 
      TrackTest += [d] 
      d += stepSize 
     return TrackTest 

使用下面的測試用例,我們得到了一個(看似)與使用範圍函數類似的結果。

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

Python 2或3?在Python 3中'range'不返回一個列表,它返回一個'range'對象。一個生成器適用於Python 3版本(或Python 2'xrange') – cdarke

+0

我試過了,最後得出結論認爲,在Python中創建一個函數需要可選參數在參數條目的末尾,如'function (a,b,c = 1)'。因爲'函數(a = 1,b,c = 1)'是不允許的。 –

回答

2

看看源代碼range(這是range_new功能):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; 
    } 
} 

它在本質上是相同的方法在你TestRange,雖然你可以做TestRange(stop, step=3)但你不能做range(stop, step=3),因爲range的最後一個參數實際上並不是關鍵字arg。