作者:mobiledu2502904157 | 来源:互联网 | 2023-05-24 14:25
这是我第一次在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"的方式来处理这种情况,不仅是数组的长度,还有任何参数,其默认值是另一个(非可选)参数的函数.你会如何应对这种情况?条件分配是最佳选择吗?
谢谢!
1> Jon Clements..:
使用None
典型的标记值:
def func(a, start=0, end=None):
if end is None:
end = # whatever
# do stuff
但是,对于您的实际用例,已经有一种内置的方法可以满足Python启动/停止/步进的方式 - 这使得您的函数提供了关于内置/其他库工作方式的一致界面:
def func(a, *args):
slc = slice(*args)
for el in a[slc]:
print(el)
请参阅https://docs.python.org/2/library/functions.html#slice
如果你只想按顺序支持开始/结束,那么(请注意,这None
有效意味着直到 len(a)
用作结束或0
用作开始时):
def func(a, start=0, end=None):
return a[start:end]