这个语句块究竟在Python中做了什么?

时间:2012-05-14 11:22:17

标签: python

我是python的新手,我遇到了这个特定的代码片段来计算序列中最大的切片,但是我似乎无法理解以下代码

best = A[0] 
for size in range(1,n+1): 
   cur = sum(A[:size]) 
   for i in range(n-size): 
      cur += A[i+size] -= A[i] # <- what happens here?
      best = max(best, cur) 

关于代码如何运作以及特别是该行的任何想法都会有所帮助!

2 个答案:

答案 0 :(得分:2)

一般来说,表达式将在进行最终赋值之前从左到右进行评估。

但是,我不相信这是有效的语法 - 你有这个代码的来源吗?

这个简单的代码失败了:

In [246]: a = 5
In [247]: b = 10
In [248]: c = 0

In [249]: c += a -= b
  File "<ipython-input-249-67e83b5a3545>", line 1
    c += a -= b
            ^
SyntaxError: invalid syntax

您可以尝试将此行分为两个单独的语句:

即,

cur += A[i+size] -= A[i]

变为

A[i+size] -= A[i]

cur += A[i+size]

假设您忠实地复制了代码,一些作者不会测试最终副本中包含的代码,因此我怀疑运算符被修复的错误(特别是-=可能是其他运算符,例如{ {1}})

顺便说一下,我查看了书籍here勘误表(位于页面底部)。它没有列出此错误,您可以考虑将其提交给其他读者。

答案 1 :(得分:2)

首先,代码中的错误是额外的=。工作代码:

n = len(A)
best = A[0] 
for size in range(1,n+1): 
   cur = sum(A[:size]) 
   for i in range(n-size): 
      cur += A[i+size] - A[i] # <- what happens here?
      best = max(best, cur)

外部for循环创建越来越大的切片,从size设置为1开始。然后cur设置为size的{​​{1}}项的总和

在内部循环中,通过将值添加到切片右侧(A)并减去切片的第一个值(A[i+size]),将此切片“移动”到右侧。

最后A[i]设置为新计算的总和中的较大值,以及迄今为止找到的最大值。

最后,best包含最大的总和。除非best包含负值,否则答案很简单:A

编辑:我刚注意到有一个错误:除了切片大小为1(sum(A))之外,最左边的切片不计算在内。因此,如果best = A[0]输出A = [4, 3, 2]而不是5。通过在内部for循环上方添加9行来修复。