69,371
社区成员
发帖
与我相关
我的任务
分享
static PyObject *
builtin_range(PyObject *self, PyObject *args)
{
long ilow = 0, ihigh = 0, istep = 1;
long bign;
Py_ssize_t i, n;
PyObject *v;
if (PyTuple_Size(args) <= 1) {
if (!PyArg_ParseTuple(args,
"l;range() requires 1-3 int arguments",
&ihigh)) {
PyErr_Clear();
return handle_range_longs(self, args);
}
}
else {
if (!PyArg_ParseTuple(args,
"ll|l;range() requires 1-3 int arguments",
&ilow, &ihigh, &istep)) {
PyErr_Clear();
return handle_range_longs(self, args);
}
}
if (istep == 0) {
PyErr_SetString(PyExc_ValueError,
"range() step argument must not be zero");
return NULL;
}
if (istep > 0)
bign = get_len_of_range(ilow, ihigh, istep);
else
bign = get_len_of_range(ihigh, ilow, -istep);
n = (Py_ssize_t)bign;
if (bign < 0 || (long)n != bign) {
PyErr_SetString(PyExc_OverflowError,
"range() result has too many items");
return NULL;
}
v = PyList_New(n);
if (v == NULL)
return NULL;
for (i = 0; i < n; i++) {
PyObject *w = PyInt_FromLong(ilow);
if (w == NULL) {
Py_DECREF(v);
return NULL;
}
PyList_SET_ITEM(v, i, w);
ilow += istep;
}
return v;
}
这是别人实现的range函数range
def my_range(start, stop = None, step = 1):
2 # 实现自己的 range
3 if stop == None:
4 start, stop = 0, start
5
6 result = []
7 if step > 0:
8 i = start
9 while i < stop:
10 result.append(i)
11 i += step
12 else:
13 i = start
14 while (i > stop):
15 result.append(i)
16 i += step
17 return result