Cea*_*sta 11 python overloading range default-value
所以我正在编写一个带有可选列表的函数,并将其扩展到指定的长度.而不是将其写为foo(n,list = None),我想知道如何模拟Python的范围函数的行为,其工作方式如下:
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(5, 10)
[5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
也就是说,首先使用默认参数.为了参考试图天真地设置它返回一个语法错误:
def foo(x=10, y):
return x + y
SyntaxError: non-default argument follows default argument
Run Code Online (Sandbox Code Playgroud)
所以我想知道,这是硬编码到范围内吗?或者可以模仿这种行为?
kin*_*all 10
其他人已经展示了如何使用参数计数来完成它.如果我自己在Python中实现它,我会更喜欢这样做.
def range(start, limit=None, stride=1):
if limit is None:
start, limit = 0, start
# ...
Run Code Online (Sandbox Code Playgroud)
range用纯python 编写的一种方法是
def range(*args):
if len(args) > 3:
raise TypeError, 'range expected at most 3 arguments, got %d' % len(args)
if len(args) == 2:
return range(args[0], args[1], 1)
if len(args) == 1:
return range(0, args[0], 1)
else:
# actual code for range(start, stop, step) here
Run Code Online (Sandbox Code Playgroud)
Python range()通过查看参数的数量来实现.编写此代码的Python版本应该不会太难
来自rangeobject.c:
static PyObject *
range_new(PyTypeObject *type, PyObject *args, PyObject *kw)
{
rangeobject *obj;
long ilow = 0, ihigh = 0, istep = 1;
unsigned long n;
if (!_PyArg_NoKeywords("xrange()", kw))
return NULL;
if (PyTuple_Size(args) <= 1) {
if (!PyArg_ParseTuple(args,
"l;xrange() requires 1-3 int arguments",
&ihigh))
return NULL;
}
else {
if (!PyArg_ParseTuple(args,
"ll|l;xrange() requires 1-3 int arguments",
&ilow, &ihigh, &istep))
return NULL;
}
if (istep == 0) {
PyErr_SetString(PyExc_ValueError, "xrange() arg 3 must not be zero");
return NULL;
}
n = get_len_of_range(ilow, ihigh, istep);
if (n > (unsigned long)LONG_MAX || (long)n > PY_SSIZE_T_MAX) {
PyErr_SetString(PyExc_OverflowError,
"xrange() result has too many items");
return NULL;
}
obj = PyObject_New(rangeobject, &PyRange_Type);
if (obj == NULL)
return NULL;
obj->start = ilow;
obj->len = (long)n;
obj->step = istep;
return (PyObject *) obj;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4970 次 |
| 最近记录: |