Python的range函数为什么会在实际参数前有默认参数?
我正在写一个函数,这个函数可以接收一个可选的列表,并把它扩展到指定的长度。我在想,能不能像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
它们并不是真正的关键字参数。
如果只有一个参数,那就是限制值。
如果有两个参数,第一个是起始值,第二个是限制值。
如果有三个参数,第一个是起始值,第二个是限制值,第三个是步长。