2016-03-29 4 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_new機能です)rangeのソースコードを見てみましょう: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(stop, step=3)を行うことができますが、それは、基本的にあなたのTestRangeと同じアプローチですがrangeの最後の引数は実際にはキーワードargではないため、range(stop, step=3)は実行できません。