让的奇怪论点

2024-10-02 22:27:43 发布

您现在位置: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

但是例如,帮助功能会显示奇怪的信息。所以我真的想知道是否有可能定义一个像上面这样的函数(第一个)。


Tags: 函数default列表参数定义foodef步骤
3条回答
def foo(first, second=None, third=1):
     if second is None:
         start, stop, step = 0, first, 1
     else:
         start, stop, step = first, second, third

range()接受一个位置参数和两个可选参数,根据传入的参数数量对这些参数进行不同的解释。

如果只传入了一个参数,则假定它是stop参数,否则第一个参数将被解释为start。

实际上,range()coded in 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

range不接受关键字参数:

range(start=0,stop=10)
TypeError: range() takes no keyword arguments

它接受1、2或3个位置参数,这些参数根据其编号进行计算:

range(stop)              # 1 argument
range(start, stop)       # 2 arguments
range(start, stop, step) # 3 arguments

也就是说,不可能创建具有定义的stopstep和默认值start的范围。

相关问题 更多 >