范围的奇怪论据

时间:2013-04-08 09:03:36

标签: python python-3.x arguments range

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

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

4 个答案:

答案 0 :(得分:14)

range()需要1个位置参数和2个可选参数,根据传入的参数数量不同地解释这些参数。

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

实际上,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

答案 1 :(得分:9)

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的范围。

答案 2 :(得分:1)

def foo(first, second=None, third=1):
     if second is None:
         start, stop, step = 0, first, 1
     else:
         start, stop, step = first, second, third

答案 3 :(得分:0)

您现在知道,真正的答案是range是一个C函数,由于某种原因它没有相同的python规则(很高兴知道为什么)。

人们可能会讨厌我提出这个建议,但是由于我对事物的顺序记忆犹豫,所以我一直在做这个。 Imo这应该不是问题,所以我要解决它:

range(*{'start':0,'stop':10,'step':2}.values())

之所以将它设为一个线性是因为我不想定义一个需要在任何地方定义或在任何地方导入的范围函数。这是纯Python。