弱问, python是不是重载?(这个版本有很多c++, python大神)

苦逼码农 2015-12-15 08:15:39
>>> print(range.__doc__)
range([start,] stop[, step]) -> list of integers

Return a list containing an arithmetic progression of integers.
range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
When step is given, it specifies the increment (or decrement).
For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!
These are exactly the valid indices for a list of 4 elements.
>>>
>>>
>>>
>>> range(2) #2表示stop,start= 0, 为什么可以只传stop ?
[0, 1]
>>> range(1, 2)
[1]



python有默认参数,关键参数, python规定: def fun(a = 0, b, c = 0) 是错误的,也就说,

range这个函数的原型不能够是 : fun(start = 0 , stop, step = 1) !!!

既然不能能够是这种函数原型,那么range(2)这是神马语法?

...全文
117 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2015-12-16
  • 打赏
  • 举报
回复
1L回答的很好,就是自行判断参数个数而已。
corfox_liu 2015-12-15
  • 打赏
  • 举报
回复
Python不支持像C++一样的重载,但可以实现类似重载的功能,你可以搜一下。 这是range的源码源码
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

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧