我想知道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)
答案 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。