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

Why does the Range() method in Python have an optional parameter yet its second parameter is not optional?

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

上面写着start参数是可选的,默认为1,但是第二个参数stop是必须的

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

Range 最多需要三个(未命名)参数 - 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]) 都在强制参数之后。只是“第一个参数”的解释在两种情况下是不同的。

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

  • 如果传递了 1 个参数,它会将开始视为隐式,将唯一的参数视为结束值。
  • 如果传递了 2 个参数,它会将第一个参数视为起始值,将第二个参数视为终止值。
  • 如果传递了 3 个参数,它会将第一个参数视为起始值,第二个作为终止值,第三个作为步长。

下面是一个人为的、可能有错误的例子,说明如何实现这样的功能:

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)

如果您想自己实现一个具有不同签名(如 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 ..

 

确实你不能在可选参数之后有非可选参数,除非你使用 kwargs,但范围是一个特殊的 class,它是 python 的内置,它的源代码实际上写在C. 所以范围是一个特殊的范围,如果你:

  • 传入一个参数作为停止点(它假设从 0 开始,第 1 步)
  • 传入两个参数开始,停止(假设第 1 步)
  • 传入三个参数,开始、停止、步骤

在正常的 python 函数和 classes 中,尽管 afaik 你不能像那样覆盖顺序。除非您使用跟踪输入的包装函数。