python中range()参数的顺序

时间:2016-03-29 14:40:47

标签: python range

我想知道Python 2.7中的range()函数如何能够具有如下语法:

range(start, stop[, step])

在Python中创建函数时,需要将可选参数放在参数条目的末尾,如:

function(a, b, c=1)

(由于某种原因,我找不到声明range()的文件,所以......) 但是可以只输入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)

1 个答案:

答案 0 :(得分: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。