在默认值之前将默认值传递给函数

时间:2016-05-14 15:40:29

标签: python-3.x

我正在尝试编写一个在某个范围内找到素数的程序。我正在尝试做的事情之一是允许在没有所有参数的情况下调用函数。

我想做的是这样的事情:

def find_primes(start=1, stop, primes=None):

然后将primes变量初始化为空白列表(我试图使程序递归)。

但是,这会导致错误,因为我无法在所有必需值之前使用参数的默认值。

我想到这样做的一种方式是:

def find_primes(start, stop=-1, primes=None):
    if primes is None:
        primes = []
    if stop = -1:
        stop = start
        start = 1

基本上,如果停止保持默认值超出范围,我可以翻转变量。然而,这似乎相当hacky,我希望有更好的方法来做到这一点。

我知道这是实现的某个地方的例子是范围功能,因为我可以将其称为

range(stop)

range(start, stop[, step])

这可以实现吗?提前谢谢。

编辑:在其他语言中,我可以使用函数重载:

def find_primes(stop):
    return find_primes(1, stop)
def find_primes(start, stop, primes=None)
    #Code

这在Python中是否存在?

1 个答案:

答案 0 :(得分:0)

Range是一个内置函数,但如果它是用Python实现的,它可能会使用相同的" Hack"正如你的建议。由于Python没有C / Java风格的函数重载,所以" Hack"真的是在没有*args的Python中实现这一目标的唯一方法,当你使用None作为默认值(而不是任意-1)时,它甚至可以被认为是惯用的:

def find_primes(start_or_stop, stop_or_none=None, primes=None):
    """
    find_primes([start], stop, [primes])
    """
    # ^ Communicate the semantics of the signature by the docstring,
    # like `range` does.   
    if primes is None:
        primes = []
    if stop_or_none is None:
        start, stop = 1, start_or_stop
    else:
        start, stop = start_or_stop, stop_or_none