这是我第一次在 SO 中提问,所以如果我以某种方式没有正确地做它,请不要犹豫编辑它或让我修改它。
我认为我的问题有点笼统,所以我很惊讶没有找到与此主题相关的任何以前的问题。如果我错过了它并且这个问题重复了,如果你能提供一个链接到已经回答的地方,我将不胜感激。
假设我需要使用(至少)三个参数实现一个函数:数组a
、start
索引和end
索引.如果没有提供,start
参数应该指向数组的第一个位置(start = 0
),而end
参数应该被设置到最后一个位置 (end = len(a) - 1
)。显然,定义:
def function(a, start = 0, end = (len(a) - 1)):
#do_something
pass
不起作用,导致异常(NameError: name 'a' is not defined
)。有一些解决方法,例如使用 end = -1
或 end = None
,并有条件地将其分配给 len(a) - 1
如果函数体内需要:
def function(a, start = 0, end = -1):
end = end if end != -1 else (len(a) -1)
#do_something
但我觉得应该有一种更“pythonic”的方式来处理这种情况,不仅是数组的长度,而且任何参数的默认值是另一个(非可选)参数的函数。你会如何处理这样的情况?条件赋值是最好的选择吗?
谢谢!
最佳答案
通常使用诸如 None
之类的标记值:
def func(a, start=0, end=None):
if end is None:
end = # whatever
# do stuff
但是,对于您的实际用例,已经有一种内置方法可以执行此操作,它符合 Python 启动/停止/步进的方式 - 这使您的函数提供与内置/其他库工作方式一致的接口(interface):
def func(a, *args):
slc = slice(*args)
for el in a[slc]:
print(el)
参见 https://docs.python.org/2/library/functions.html#slice
如果您只想按该顺序支持开始/结束,那么(注意 None
实际上意味着 until len(a)
当当用作开始时用作结束或0
:
def func(a, start=0, end=None):
return a[start:end]
关于python - 使用参数数组的长度作为同一函数的另一个参数的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28212364/