Python实验作业问题:SD1列输出0但standard1函数计算值正确
标准差计算实验:SD1列无法存储值的问题修复
问题描述
我正在完成计算机科学课程的标准差计算实验,代码整体逻辑正常,DEV/DEV1列可正常输出,但SD1列始终输出0;尽管standard1函数能正确打印出SD1的计算值,却无法将值存入sd1列表以在对应列显示。
原代码
n=20 import math def main(): #Listdec x=[0]*n dev=[0.0]*n dev1=[0.0]*n sd1=[0]*n #filedec infile=open("lab4.txt","r") outfile=open("lab4.out","w") #vardec sumx=0.0 std=0.0 xbar=0.0 dev2=0.0 sd2=0.0 #callfunction sumx=loadrec(infile,x) sd2=standard1 #compute average xbar=sumx/n #call deviation function dev2=deviation(x,dev,dev1,xbar) #compute standard deviation std=math.sqrt(dev2/n) #function standard standard1(x,xbar,std,sd1) #sd2=standard(dev1,sd1,std) #calloutdata outdata(outfile,x,dev,dev1,sd1) print("SUM=",sumx) print("AVG=",xbar) print("STD=",std) print("SD2=",sd2) #closefile infile.close() outfile.close() dummy=input("Press enter to continue") #you know what this is by now #functions def loadrec(file,a): #local var k=0 s=0 while(k<n): #reads first line of data templist=file.readline().strip('\n').split(',') a[k]=int(templist[0]) s=s+a[k] k=k+1 return(s) def standard1(a,b,c,d): #a=student score b=avg c=standard deviation k=0 s=0 while(k<n): s=(a[k]-b)/c print(s) k=k+1 return(k) def deviation(a,b,c,d): #a=x b=dev c=dev1 d=xbar #local var k=0 s=0 while(k<n): b[k]=d-a[k] c[k]=b[k]*b[k] s=s+c[k] k=k+1 return(s) def outdata(file,a,b,c,d): #localvar #file=outfile a=x b=dev c=dev1 d=sd1 k=0 #shoves the results to the screen print("Scores"," ","DEV"," ","DEV1"," ","SD1","\n") while (k<n): print((str(a[k])+str(" ")+str(b[k])+(" ")+str(c[k])+str(" ")+str(d[k]))) file.write(str(a[k])+" "+str(b[k])+" "+str(c[k])+str("\n")) k=k+1 main()
数据文件lab4.txt内容
75 90 80 85 76 70 68 84 92 80 50 60 73 89 100 40 75 76 94 86
问题排查
- 核心问题:
standard1函数未将计算值存入列表
函数仅计算并打印了标准化值,但未将结果赋值给传入的sd1列表(参数d),导致sd1始终保持初始全0状态。 - 次要问题:无效的
sd2赋值sd2=standard1是将函数对象本身赋值给变量,而非调用函数,完全不符合预期逻辑。 - 输出文件缺失SD1数据
outdata函数的文件写入部分仅包含Scores、DEV、DEV1三列,未写入SD1的计算结果。
解决方案
1. 修复standard1函数
修改函数逻辑,将计算结果存入sd1列表:
def standard1(a,b,c,d): #a=学生分数 b=平均分 c=标准差 d=sd1列表 k=0 while(k<n): # 将标准化值存入列表对应位置 d[k] = (a[k]-b)/c print(d[k]) k=k+1
2. 修正sd2的无效赋值
若不需要sd2可直接删除该行;若需要调用其他函数,改为正确的函数调用格式(可参考原代码中注释掉的sd2=standard(dev1,sd1,std)调整)。
3. 修复outdata函数的文件写入
让输出文件包含完整的四列数据:
def outdata(file,a,b,c,d): #file=输出文件 a=x b=dev c=dev1 d=sd1 k=0 print("Scores"," ","DEV"," ","DEV1"," ","SD1","\n") while (k<n): # 优化控制台输出格式 print(f"{a[k]:<6} {b[k]:<6.2f} {c[k]:<6.2f} {d[k]:<6.2f}") # 写入文件时包含SD1列 file.write(f"{a[k]} {b[k]:.2f} {c[k]:.2f} {d[k]:.2f}\n") k=k+1
效果验证
修改完成后,sd1列表会正确存储每个数据的标准化值,SD1列可正常显示计算结果,输出文件也会包含完整的四列数据。
内容的提问来源于stack exchange,提问作者DawsonB9822
相关产品推荐
相关产品推荐

