小编典典

范围的奇怪论点

python

python3中的range函数采用三个参数。其中两个是可选的。因此参数列表如下所示:

[开始],停止,[步骤]

这意味着(如果我错了,请纠正我)在非可选参数之前有一个可选参数。但是,如果我尝试定义这样的函数,我会得到:

>>> def foo(a = 1, b, c = 2):
    print(a, b, c)
SyntaxError: non-default argument follows default argument

这是我作为“普通” python用户无法做的事情,还是可以某种方式定义这样的功能?我当然可以做类似的事情

def foo(a, b = None, c = 2):
    if not b:
        b = a
        a = 1

但是例如,帮助功能将显示奇怪的信息。所以我真的很想知道是否有可能定义一个诸如内置函数之类的函数range


阅读 225

收藏
2020-12-20

共1个答案

小编典典

range()接受1个位置参数和两个可选参数,并根据传入的参数的不同来不同地 解释 这些参数。

如果仅传递了 一个 参数,则假定它是该stop参数,否则,第一个参数将被解释为开始。

在现实中,range()编码在C,采用可变数目的参数。您可以像这样模拟:

def foo(*params):
    if 3 < len(params) < 1:
        raise ValueError('foo takes 1 - 3 arguments')
    elif len(params) == 1
        b = params[0]
    elif:
        a, b = params[:2]
    c = params[2] if len(params) > 2 else 1

但您也可以交换参数:

def range(start, stop=None, step=1):
    if stop is None:
        start, stop = 0, start
2020-12-20