在以下代码中:
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
Run Code Online (Sandbox Code Playgroud)
是每次我创建的新列表listSum(alist[1:])?
如果是,这是推荐的方式还是我可以做更高效的事情?(不是针对特定的功能 - 这是一个例子 - 而是当我想要处理列表的特定部分时.)
编辑:
对不起,如果我困惑任何人,我对一个有效的sum实现不感兴趣,这作为一个例子,以这种方式使用切片.
小智 5
是的,它每次都会创建一个新列表.如果你可以使用iterable,你可以使用itertools.islice或玩杂耍iter(list)(如果你只需要在开始时跳过一些项目).但是当你需要确定参数是空的还是只有一个元素时,这会变得混乱 - 你必须使用try并捕获StopIteration.编辑:您还可以添加一个额外的参数来确定从哪里开始.与@ marcadian的版本不同,你应该把它作为默认参数,不要给调用者带来负担,并避免从外部传入错误索引的错误.
在这种情况下通常会更好 - 要么编写代码以便可以让for迭代处理(读取:不要像这样使用递归).或者,如果切片相当小(可能因为整个列表很小),无论如何咬住子弹和切片 - 它更容易,而切片是线性时间,常数因子非常小.