while必须加break吗?

n = float(input("请输入科目数量:"))
numbers = []
credits = []
weights = []
fcredits=[]
numbers = input('请输入一组成绩(以空格隔开,按回车结束):').split(' ')
credits = input('请输入分数对应科目的学分(以空格隔开,按回车结束):').split(' ')
i = int(0)
c = float(0)
b = float(0)
a = int(0)

while a<n:                                                 #使分数变为浮点数
    numbers[a] = float(numbers[a])
    a = a+1

for credit in credits:
    credit = float(credit)                                 #使学分变为浮点数
    fcredits.append(credit)                                #存储浮点类型的学分
    c = c+credit                                           #求总学分

for credit in credits:
    credit = float(credit) / c                             #求每一科权重
    weights.append(credit)                                 #储存每一科权重
    while i<n:
        b=b+numbers[i]*weights[i]                          #依据权重和每一科分数,求总分
        i=i+1
        break


print(fcredits)
print(numbers)
print(weights)

print(b)
print(a)

这段代码的第28行,如果把break去掉,就会提示第26行的列表超出范围。为什么会这样呢?当i=n的时候while循环不是停止了吗?

你的代码里面while部分作用就是i+1,并且只是执行了一次,就跳出了while的循环,满足i=n的再结束是正常结束,break的作用是非正常结束,break一般用来和if,elif,else 搭配使用,满足条件就退出,不用执行完再退出,有用的话点一下采纳

不用break
numbers = input('请输入一组成绩(以空格隔开,按回车结束):').split(' ')
credits = input('请输入分数对应科目的学分(以空格隔开,按回车结束):').split(' ')
输入完,输出看看,列表索引溢出,肯定就是列表有问题。

有帮助点个采纳 谢谢

weights 这个 列表永远只有一个元素啊,不可能取到weights[1],for循环那里只最开始加了一次,后面要一直循环while的 ,进去while里面weights 数据没变化

这里的while语句改成if语句就好理解了,将
while i<n:
b=b+numbers[i]*weights[i] #依据权重和每一科分数,求总分
i=i+1
break
这一段改成:
if i<n:
b=b+numbers[i]*weights[i] #依据权重和每一科分数,求总分
i=i+1
for credit in credits第一次遍历时,
weights.append(credit),这时weights里只插入了一个元素,其index只有'0'一个值,
而while循环执行一次后,i=i+1=1<n,他会执行第二次循环,这个时候weight[i]=weight[1],肯定就是索引超出范围了
所以这里用if语句比较合适,也容易理解
你在原程序weights.append(credit)后加一个打印语句
for credit in credits:
credit = float(credit) / c #求每一科权重
weights.append(credit) #储存每一科权重
print(weights)
再跑一遍程序就能理解了

第 25 行,while 循环不应该缩进,否则在 for 循环第一次的时候,weights 里只有一个元素,这样当 while 循环到第二次的时候,就会超出范围了。不需要用 break。最简单的解决办法就是删除 while 循环的缩进,使 while 循环和上面的 for 循环是同样的缩进。望采纳!