在下面的代码中:
def listSum(alist):
"""Get sum of numbers in a list recursively."""
sum = 0
if len(alist) == 1:
return alist[0]
else:
return alist[0] + listSum(alist[1:])
return sum
每次我这样做时都会创建一个新列表listSum(alist[1:])
?
如果是,这是推荐的方式还是我可以做一些更有效的事情? (不是针对特定功能 - 这只是一个例子 - 而是当我想处理一般列表的特定部分时。)
Edit:
抱歉,如果我让任何人感到困惑,我对高效不感兴趣sum
实现,这是使用这种方式切片的示例。
是的,它每次都会创建一个新列表。如果你可以避免使用迭代,你可以使用itertools.islice
,或者杂耍iter(list)
(如果您只需要在开始时跳过某些项目)。但是,当您需要确定参数是否为空或只有一个元素时,这会变得混乱 - 您必须使用try
并抓住StopIteration
。编辑:您还可以添加一个额外的参数来确定从哪里开始。与 @marcadian 的版本不同,您应该将其设为默认参数,以免给调用者带来负担,并避免从外部传入错误索引而产生错误。
通常最好不要陷入这种情况 - 要么编写您的代码,以便您可以让for
处理迭代(阅读:不要像那样使用递归)。或者,如果切片相当小(可能是因为整个列表很小),无论如何都要硬着头皮进行切片 - 这更容易,虽然切片是线性时间,但常数因子确实很小。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)