gpt4 book ai didi

python - python 中 range() 参数的顺序

转载 作者:行者123 更新时间:2023-12-01 04:02:12 27 4
gpt4 key购买 nike

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

range(start, stop[, step])

由于在 Python 中创建函数需要可选参数位于参数条目的末尾,如下所示:

function(a, b, c=1)

(由于某种原因,我找不到声明 range() 的文件,所以......)但也可以仅输入单个(停止)整数,如 range(10)

range 是否使用如下所示的某种构造?或者有更优雅的方法来做到这一点吗?

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)

最佳答案

看一下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 的最后一个参数实际上并不是关键字参数。

关于python - python 中 range() 参数的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36287536/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com