第1关:计算标准差
任务描述
和平均值一样,标准差也是反映数据分布特性的一个重要指标。平均值反映的是数据的平均水平,而标准差反映的是数据的离散程度,标准差越小,则数据波动越轻微(如下左图,红线表示平均值的位置),反之则越强烈(如下右图)。
假设有 n 个数据x0,x 1,x2,…,xn−1,则它们的标准差 σ 定义如下: 其中,μ 是这 n 个数据的平均值,即: 本关任务就是计算列表 L=[101, 25, 38, 29, 108, 121] 中数据的标准差。
编程要求
补全 Begin-End 区间的代码,其功能是计算列表L中数据的标准差 σ(用变量sigma表示)。
L = [101, 25, 38, 29, 108, 121]########## Begin ##########num=0sigma=0for i in L: num+=inum=num/len(L)for j in L: sigma+=(j-num)**2sigma=(sigma/len(L))**0.5########## End ##########print('%.2f' % sigma)第2关:计算向量内积
任务描述
背景
高中学习过向量的概念,例如二维坐标系的坐标 (x,y) 就可以表示一个向量。在更高维度的空间,其实也有类似的表示方法,如三维空间的 (x,y,z)。实际上,n 维空间的向量可以表示为 (x1,x2,x3,…,xn),即 n 个数值的有序组合,这其实就是《线性代数》课程中对向量的更一般定义方法,而 (x,y) 只是它的一种特殊情况。
在向量中,有一个内积(点乘)的概念。设向量 x=(x1,x2,x3,…,xn)、y=(y1,y2,y3,…,yn),则 x 和 y 的内积定义为:x1y1+x2y2+x3y3+⋯+xnyn
任务
从结构上看,Python 中的列表是有序元素的组合,这其实和向量的定义是类似的,所以用列表来表示和处理向量十分直观。假设有如下两个用列表表示的向量:
X = [1.2, 2.3, 3.4, 4.5, 5.6]Y = [6.5, 5.4, 4.3, 3.2, 2.1]本关任务是计算它们的内积。
相关知识
利用 for 循环,可以很方便地依次取出一个列表中的元素,例如下面的程序是依次取出列表L中的各个元素并进行打印。
X = [1.2, 2.3, 3.4, 4.5, 5.6]for x in X: print(x)但是,如果要同时取出多个列表中对应位置的元素,下面这种写法是错误的:
X = [1.2, 2.3, 3.4, 4.5, 5.6]Y = [6.5, 5.4, 4.3, 3.2, 2.1]for x,y in X,Y: print(x,y)此时一般使用两种方法。第一种是利用列表的编号同时访问多个列表:
X = [1.2, 2.3, 3.4, 4.5, 5.6]Y = [6.5, 5.4, 4.3, 3.2, 2.1]for i in range(len(X)): #i从0变到n print(X[i], Y[i]) #同时打印列表X和Y中的第i号元素第二种方法是使用zip函数将多个列表打包成一个对象(关于zip函数的具体功能,请自行上网查询):
X = [1.2, 2.3, 3.4, 4.5, 5.6]Y = [6.5, 5.4, 4.3, 3.2, 2.1]for x,y in zip(X,Y): #用zip打包两个列表后,就可以同时取出相同位置的元素 print(x,y)两种方法达到的效果是一样的,但使用zip更加方便,而利用编号则更好理解、更加通用(因为其他编程语言不一定支持zip函数)。
编程要求
补全 Begin-End 区间的代码,其功能是计算列表X和Y所表示向量的内积(用变量XdotY表示)。
X = [1.2, 2.3, 3.4, 4.5, 5.6]Y = [6.5, 5.4, 4.3, 3.2, 2.1]########## Begin ##########XdotY=0for i in range(len(X)): XdotY += X[i] * Y[i]########## End ##########print('%.2f' % XdotY)第3关:查找学生信息
任务描述
现有如下三个列表:
ID = [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008]
name = ['张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十']
grade = [100, 87, 65, 58, 78, 65, 69, 85]分别存放了某课程学生的学号、姓名和成绩,三个列表的元素具有对应关系,如张三的学号是 1001、成绩是 100 分,李四的学号是 1002、成绩是 87 分。
本关任务是查找成绩在区间 [a,b] 中的学生学号和姓名,若没有满足条件的学生,则打印未找到。
相关知识
本题的难点在于没找到时要打印未找到。可以先不管这个要求,完成其他功能后再考虑如何添加这个功能,思路如下。
思路1:再设置一个列表,用来存放满足条件的学生序号,如果第i号学生满足条件,则将i追加到列表。查找结束后,如果列表为空(即长度为 0),则打印未找到,否则根据该列表中的序号依次打印对应学生的信息。
思路2:设置一个布尔类型的变量,用来记录是否找到,为False时表示没找到,为True时表示找到了。该变量最开始时为False,在查找过程中,如果找到了学生,则将其改为True。如果查找结束后该变量还为False,则打印未找到。
编程要求
补全 Begin-End 区间的代码,功能是查找成绩在区间 [a,b](分别用变量a和b表示)中的学生学号和姓名,按列表中的顺序打印学生信息。
ID = [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008]name = ['张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十']grade = [100, 87, 65, 58, 78, 65, 69, 85]a = eval(input())b = eval(input())########## Begin ##########x = 0for i in range(len(grade)): if a<=grade[i]<=b: print(ID[i], name[i]) x = 1if x == 0: print('未找到')########## End ##########如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时



























