我正在尝试从维基百科理解卡登算法,然后我发现了这个:
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:]:
的等价写法?
for x in A[1:]
更改为for x in range(1, len(A))
时,我应该使用A[x]
而不仅仅是x
来访问元素。在for x in A[1:]: doSomething(x)
和for x in range(1, len(A)): doSomething(A[x])
之间有什么区别吗? - Margo EasthamA[x]
。如果您想要将索引用于其他内容,则可能希望这样做。前一种语法被认为更具“Python风格”,而后者则更冗长。前一种方法(迭代对象)可能更适合与支持切片语法的列表以外的对象一起使用。后一种版本假定通过基于0的整数索引进入集合。但实际上,这不应该有任何区别。它更多关于类型依赖性/假设和代码清晰度。 - Preet Kukretifor i, x in enumerate(my_list[1:], 1):
将会从1开始计数。 - PM 2Ring