我试图从维基百科上了解卡丹的算法,这时我发现:
def max_subarray(A):
max_ending_here = max_so_far = A[0]
for x in A[1:]:
max_ending_here = max(x, max_ending_here + x)
max_so_far = max(max_so_far, max_ending_here)
return max_so_far
我不熟悉Python。我试着用谷歌搜索这个语法的作用,但是我找不到正确的答案,因为我不知道它叫什么。但是,我认为A[1:]
等同于省略A[0]
,所以我认为for x in A[1:]:
等同于Java中的for(int i = 1; i < A.length; i++)
但是,在将for x in A[1:]:
更改为for x in range(1,len(A))
之后,我得到了错误的结果
如果这是个愚蠢的问题,我很抱歉,但我不知道还能在哪里找到答案。有人能告诉我这个语法是什么,叫什么吗?另外,你能给我Java中for x in A[1:]:
的等价物吗?
这是array slice语法。请看这个问题: Explain Python's slice notation。
对于对象的列表
my_list
,例如[1, 2, "foo", "bar"]
,my_list[1:]
相当于从0索引1
:[2, "foo", "bar"]
开始的所有元素的浅复制列表。因此,您的for
语句迭代这些对象:range(..)
返回索引(整数)的列表/生成器,因此for语句将遍历整数[1, 2, ..., len(my_list)]
所以在后一个版本中,可以使用
x
作为列表的索引:iter_obj = my_list[x]
。或者,如果您仍然需要迭代索引(例如,对于当前对象的“count”),则可以使用
enumerate
:如果您决定将
my_list
的类型更改为其他类型,则此版本更具前瞻性,因为它不依赖基于0的索引的实现细节,因此更可能使用支持切片语法的其他可iterable类型。与其他语言不同,在Python中遍历序列会生成序列本身中的元素。这意味着迭代
[1, 2, 4]
依次产生1
、2
和4
,而不是0
、1
和2
。下面是一些我试过的例子
我想你可以通过这些例子了解更多。
相关问题 更多 >
编程相关推荐