为什么Range()方法在Python中有一个可选参数,但它的第二个参数不是可选的?



新手,据我所知,在可选参数之后不能有非可选参数,所以当我看到range()方法的文档时,我很困惑。这是怎么回事,我错过什么了吗?

表示start参数是可选的,默认为1,但第二个参数stop是必选的。

链接到range()函数:https://docs.python.org/3/library/stdtypes.html

根据传递的参数范围的数量,行为会发生变化。

  • 如果传递1个参数,它将隐式地处理开始值,并将唯一的参数作为停止值。
  • 如果传递了2个参数,它将第一个参数作为开始值,第二个参数作为停止值。
  • 如果传递了3个参数,它将第一个参数作为开始值,第二个参数作为停止值,第三个参数作为步长。

下面是一个人为的、可能有bug的函数实现示例:

def myrange(arg1, arg2=None, arg3=None):
if not arg2:
return range(arg1)
if not arg3:
return range(arg2, arg1)
return range(arg2, arg1, arg3)

除非使用kwargs,否则在可选参数之后确实不能有非可选参数,但range是python内置的一个特殊类,它的源代码实际上是用c编写的,所以range是一个特殊的类,如果你:

  • 传递一个参数的停止(它假设开始于0和步骤1)
  • 传递两个参数:start, stop(假设步骤1)
  • 传入三个参数start, stop, step

在普通的python函数和类中,您可能无法像这样重写顺序。除非使用跟踪输入的包装器函数。

范围最多包含三个(未命名)参数-startendstep

如果只传递一个参数,则假定start为零,给定的参数为end

因此,例如,range(5)与range(0,5)完全相同。

然而,如果你想提供一个step值,即使start打算为零,你也必须传递所有三个参数——例如range(0,10,2)

文档列出了两种情况:

class range(stop)
class range(start, stop[, step])

所以如果你只传递一个参数,第一种情况适用;函数将参数解释为stop

如果传递多个参数,则适用第二种情况;函数将第一个参数解释为start,依此类推。

在这两种情况下,可选参数([step])在强制参数之后。只是对"第一个参数"的解释

如果您想自己实现具有不同签名的函数(如range()),您可以这样做:

def myRange(*args):
if   len(args) == 1: start,stop,step    = 0,*args,1
elif len(args) == 2: start,stop,step    = *args,1
else:                start,stop,step,*_ = args
print(start,stop,step)
# ... work with start, stop, step ..

相关内容

  • 没有找到相关文章

最新更新