Python的range函数为什么会在实际参数前有默认参数?

12 投票
5 回答
7512 浏览
提问于 2025-04-16 21:13

我正在写一个函数,这个函数可以接收一个可选的列表,并把它扩展到指定的长度。我在想,能不能像Python的range函数那样来写,而不是用foo(n, list=None)这种方式。

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

所以我在想,这种行为是range函数里固定写死的吗?还是说我可以模拟这种行为?

5 个回答

8

用纯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
12

其他人已经展示了如何通过计算参数来实现这个功能。不过,如果让我自己在Python中实现的话,我会这样做。

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

它们并不是真正的关键字参数。

如果只有一个参数,那就是限制值。

如果有两个参数,第一个是起始值,第二个是限制值。

如果有三个参数,第一个是起始值,第二个是限制值,第三个是步长。

撰写回答