如何实现 range 函数的参数?
关于 range 函数
Python
内置的range
函数可以接收三个参数:
class range(stop):
...
class range(start, stop[, step]):
...
标准库中解释为:range
构造器的参数必须为整数(可以是内置的 int
或任何实现了 __index__
特殊方法的对象)。如果省略 step
参数,其默认值为 1
;如果省略 start
参数,其默认值为 0
,如果 step
为零则会引发 ValueError
。
range 的使用
range
函数返回的结果会包含 start
参数,而不包含 stop
参数,当接收到的参数只有 1 位时,range
会把这位参数作为 stop
,当接受到的参数有 2 位时,则第 2 位参数会被视为 stop
,只有当接收 3 位参数时,默认的 step
才会被传入的参数代替,也就是说,如果我们需要 0 到 5 之间的数字,每隔 2 个整数返回,那么第一个参数 start
就算为 0
,也必须显示的指定才行,否则传入的 2 个参数将被视为 start
和 stop
,示例:
>>> list(range(0, 5, 2))
[0, 2, 4]
>>> list(range(5, 2))
[]
那么,按照 Python 定义函数的方式,这是怎么实现的呢?
range 参数的实现
很明显,如果在 Python 中定义一个函数,要让第二个参数为固定参数,第一和第三个参数为默认参数是会引发语法错误的:
>>> def range(start=0, stop, step=1):
>>> pass
File "<ipython-input-23-876b8b222e30>", line 1
def range(start=0, stop, step=1):
^
SyntaxError: non-default argument follows default argument
那么怎样才能用 Python 实现这样的操作呢,有两种方法可以参考:
1. 定义可变参数
判断传入参数的个数,如果是一个则作为 stop
参数,如果是两个则将第 1 个作为 start
参数,同 range
一样,该方法不接受关键字参数的传入,示例:
def range(*params):
if 3 < len(params) < 1:
raise ValueError('range takes 1 - 3 arguments')
elif len(params) == 1
b = params[0]
else:
a, b = params[:2]
c = params[2] if len(params) > 2 else 1
2. 交换参数
设置 stop
和 step
的默认值,该方法可以接收关键字参数的传入。示例:
def range(start, stop=None, step=1):
if stop is None:
start, stop = 0, start