我正在尝试编写一个在某个范围内找到素数的程序。我正在尝试做的事情之一是允许在没有所有参数的情况下调用函数。
我想做的是这样的事情:
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中是否存在?
答案 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