新手,据我所知,在可选参数之后不能有非可选参数,所以当我看到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函数和类中,您可能无法像这样重写顺序。除非使用跟踪输入的包装器函数。
范围最多包含三个(未命名)参数-start,end和step。
如果只传递一个参数,则假定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 ..