这是作业:
'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。
出什么问题了? 我在课程解决方案中看到了解决此问题的另一种方法,但是我想知道这段代码中到底有什么问题。
答案 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