我该怎么做才能使此代码起作用? (蟒蛇)

时间:2019-09-18 14:11:25

标签: python python-3.x

这是作业:

  

'SUMMER OF '69:返回数组中数字的总和,但忽略以6和'开头的数字部分   扩展到下一个9(每6个后接至少9个)。没有数字则返回0。

这是我的代码:

def summer_69(arr):
    a = len(arr)
    sum = 0

    for i in range(0,a):

      if arr[i]!=6:
        sum+=arr[i]
        continue

      if (arr[i]==6):
          for i in range(i+1,a):
              if i==9:
                  sum+=0
                  i+=1
                  break

    return sum

当我输入的是:

d = summer_69([4, 5, 6, 7, 8, 9])
print(d)

输出为33而不是9。

出什么问题了? 我在课程解决方案中看到了解决此问题的另一种方法,但是我想知道这段代码中到底有什么问题。

2 个答案:

答案 0 :(得分:0)

即使您重新分配了i(例如,使用内部循环),外部循环仍然会从range获取下一个值,因此分配不会有任何效果(例如,对您的外部循环) 。 您可以删除内部循环,而只需设置一个标志,就可以知道是使用还是跳过当前数字。

答案 1 :(得分:0)

使用发电机实际上更容易。

def gen_summer_69(arr):
    arr_i = iter(arr)
    while 1:
        n = next(arr_i)
        if n == 6:
            while next(arr_i) != 9:
                pass
        else:
            yield n

这将根据您提到的条件过滤结果,因此您可以对结果求和。

sum(gen_summer_69([4, 5, 6, 7, 8, 9]))

因此,它的功能是:

def summer_69(arr):
    return sum(gen_summer_69(arr))

可以像您期望的那样被呼叫:

summer_69([4, 5, 6, 7, 8, 9])

编辑:由于您的要求很好,因此我将避免使用生成器。

def summer_69(arr):
    arr_len = len(arr)
    arr_sum = 0
    skip = False
    for i in range(arr_len):
        n = arr[i]
        if skip:
            if n == 9:
                skip = False
            continue
        if n == 6:
            skip = True
        else:
            arr_sum += n
    return arr_sum