Python range函数在实际参数之前如何有一个默认参数?

egmofgnx  于 2023-01-29  发布在  Python
关注(0)|答案(5)|浏览(167)

所以我写了一个函数,它接受一个可选的列表,并将其扩展到指定的长度,而不是写为foo(n,list=None),我想知道如何模拟Python的range函数的行为,其工作原理如下:

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(5, 10)
[5, 6, 7, 8, 9]

也就是说,首先使用默认参数。作为参考,尝试简单地设置此参数会返回语法错误:

def foo(x=10, y):
    return x + y
SyntaxError: non-default argument follows default argument

所以我想知道,这是硬编码到范围内的吗?或者这种行为可以被模拟吗?

goqiplq2

goqiplq21#

其他人已经展示了如何使用参数计数来实现它,但是如果我自己用Python实现它,我会更像这样做。

def range(start, limit=None, stride=1):
    if limit is None:
        start, limit = 0, start
    # ...
gfttwv5a

gfttwv5a2#

它们不是真实的的关键字参数。
如果要争论的话,那就是极限。
如果有两个参数,第一个是起始值,第二个是限制值。
如果有三个参数,第一个是起始值,第二个是限制,第三个是步幅。

wlwcrazw

wlwcrazw3#

用纯python编写range的一种方法是

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
9lowa7mx

9lowa7mx4#

Python通过查看参数的数量来实现range()。编写这段代码的Python版本应该不会太难

来自范围对象.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;
}
jw5wzhpr

jw5wzhpr5#

考虑:

def f(*args):
    nargs = len(args)
    if nargs == 1:
        start = 0
        end = args[0]
        step = 1
    elif nargs == 2:
        start = args[0]
        end = args[1]
        step = 1
    elif nargs == 3:
        start = args[0]
        end = args[1]
        step = args[2]
    else:
        raise TypeError('wrong number of arguments')

    return g(start, end, step)

相关问题