摘要:本文旨在说明Python编程在小学数学教学过程中的应用。通过6个案例,由浅入深地展示了Python在编题、解题、画图表、成绩分析中的强大功能,有效的提高了教学中的工作效率。
倡导小学教育工作者学习并使用Python,让教学工作更加如鱼得水。
关键词:Python,小学,数学
正文:比尔·盖茨说过:“每个人都应该学一点编程”。其实,在科技飞速发展的今天,编程已经不再是只有专业程序员才能使用的工具了。十年前会用Word、Excel就能满足大量工作需要了,二十年前会用电脑打字就很厉害了,三十年前会用锄头大概也可以解决温饱。如今只会这些显然远远不够,我们需要掌握更多有效工具。作为一个普通人,尤其是一名数学老师,要是也能掌握一点编程知识,将会让工作变得快捷而高效。
换做以前,C语言太难了,Java环境不好搭建,还可以说时机未到,如今Python的出现可以说是普通人学习编程的最佳时机了。第一,安装便捷,默认下一步到底就可以直接使用自带的IDLE写代码了;第二,语言精练。举个简单的例子:求1+2+3+4+……+99+100的和。写成代码只要四行,如下:
sn=0for an in range(1,101):sn+=iprint(sn)
第三,支持大量外部库,例如,创建文本,画图,打开Excel表格等,在数学教学过程中,用来编题、画图表、成绩分析等都非常实用。具体事例见下文。
下面,我将通过实际案例从编题、解题、画图表、成绩分析四个方面阐述Python在小学数学教学中的应用。
小学数学,“得计算者得天下”已是不争的事实,所以数学老师要面临大量的编写计算题的工作,通常都是这里抄一下,哪里改一下。而使用Python,事情就变得很简单多了。
编写思路:①使用random产生随机数;②使用choice方法随机选择“+、-、×、÷”符号;③使用while循环执行30次。
代码如下:
#导入库import randomfrom random import choice #设置循环i &#61; 1while i <30: a &#61; random.randint(1, 100) # 产生随机数a b &#61; random.randint(1, 100) # 产生随机数b # 随机选择加减乘除号 fh &#61; ["&#43;", "-","×","÷"] D &#61; choice(fh) #如果减数大于被减数或除数大于被除数&#xff0c;则不输出 if aand (D&#61;&#61; continue #打印算式 print(str(a) &#43; D &#43; str(b) &#43; "&#61;") i &#43;&#61; 1
注&#xff1a;如果要产生其他区间的数&#xff0c;则改变randint中的区间&#xff1b;如果要减少运算符号&#xff0c;则改变fh列表中的元素&#xff1b;如果要输出更多&#xff0c;则改变while循环的次数。
编写思路&#xff1a;分数计算题用Word来编写简直太低效&#xff0c;而Python命令行不支持分数&#xff0c;所以考虑使用标记语言Markdown来输出&#xff0c;即生成“.md”文件并使用Typora打开。
代码如下&#xff1a;
#导入库import random #定义分数函数def fenshu(a,b): fenshu&#61;r&#39;\frac{&#39;&#43;str(a)&#43;&#39;}{&#39;&#43;str(b)&#43;&#39;}&#39; return fenshu #自定义文件名称path&#61;input("输入路径名称(如&#xff1a;text.md)&#xff1a;")f &#61; open(path, &#39;w&#39;) #设置循环i &#61; 1while i <30: a &#61; random.randint(1,100) # 产生随机数 b &#61; random.randint(1,100) # 产生随机数 c &#61; random.randint(1,100) # 产生随机数 d &#61; random.randint(1,100) # 产生随机数 #公式头 up &#61; &#39;$&#39; f.write(up) #分数算式 gongshi &#61; fenshu(a, b) &#43; "&#43;" &#43; fenshu(c, d) &#43; "&#61;" f.write(gongshi) #公式尾 down &#61; &#39;$\n&#39; f.write(down) i &#43;&#61; 1f.writelines("\n")f.close()
注&#xff1a;生成的.md文件需要使用Typora软件打开&#xff0c;请提前安装好&#xff1b;支持导出图片、PDF&#xff0c;以及Word再进行编辑。
虽然用编程来解决数学计算有点投机取巧了&#xff0c;但是多掌握一种方法本身并没有什么问题&#xff0c;就好比不让学生使用计算器&#xff0c;但还是要教会学生使用计算器甚至珠算一样。换一个角度来讲&#xff0c;使用编程计算出结果&#xff0c;可以快捷地检测我们通过数学计算的结果正确与否。
编写思路&#xff1a;使用range方法产生1到99所有奇数&#xff1b;使用for循环将所有奇数的平方相加。
代码如下&#xff1a;
sn&#61;0for an in range(1,100,2): sn &#43;&#61; i**2print(sn)
案例4&#xff1a;是否存在非零自然数a&#xff0c;b&#xff0c;c 三个数满足a2&#43;b2&#xff0c;b2&#43;c2&#xff0c;c2&#43;a2 都是平方数&#xff0c;如有请举例&#xff0c;如无请说明
编写思路&#xff1a;对于数论方面的相关问题&#xff0c;通常都是可以使用枚举法来做的&#xff0c;但之所以不使用枚举是因为人的枚举能力是有极限的&#xff0c;而程序则可以突破这种极限&#xff1b;对a,b,c分别从1枚举到1000&#xff0c;如满足条件则输出。
代码如下&#xff1a;
for a in range(1,1000): #对a进行枚举 for b in range(1,1000): #对b进行枚举 d &#61;( a**2&#43;b**2)**0.5 if int(d)&#61;&#61;d: #判断a&#xff0c;b的平方和的平方根是否为整数 for c in range(1,1000):#对c进行枚举 e&#61;(a**2&#43;c**2)**0.5 f&#61;(b**2&#43;c**2)**0.5 if int(e)&#61;&#61;e and int(f)&#61;&#61;f: #判断平方根是否为整数 print(a,b,c)
注&#xff1a;这道题对于老师而言都算是难题了&#xff0c;小学生则几乎遇不到。笔者只是想说明&#xff0c;通过编程进行枚举则可以有效缓解面对难题的束手无策。难题尚能解决&#xff0c;更何况简单的题呢&#xff1f;
Excel表格自带画图表的功能&#xff0c;而且很强大&#xff0c;那为什么我们还要学习Python画图表呢&#xff1f;如果要产生大量图表&#xff0c;例如&#xff1a;每个学生的各科成绩都和平均分进行比较的条形统计图。此时用Excel就显得机械性重复作业了&#xff0c;那为什么不让程序来做呢&#xff1f;
姓名 | 总成绩 | 语文 | 数学 | 英语 |
郭靖 | 222 | 90 | 72 | 60 |
黄蓉 | 295 | 98 | 100 | 97 |
周伯通 | 199 | 60 | 59 | 80 |
平均分 | 238 | 82 | 77 | 79 |
编写思路&#xff1a;使用openpyxl库打开Excel表格&#xff1b;使用pylab绘制图像。代码如下&#xff1a;
#导入库from openpyxl import load_workbookfrom pylab import *#定义画图表函数def huatubiao(gerenchengji&#61;[],pingjunchengji&#61;[]): mpl.rcParams[&#39;font.sans-serif&#39;] &#61; [&#39;SimHei&#39;] name_list &#61; [&#39;总分&#39;,&#39;语文&#39;,&#39;数学&#39;,&#39;英语&#39;] x &#61;list(range(len(gerenchengji)-1)) #列表第一元素为姓名&#xff0c;减去 total_width, n &#61; 0.8, 2 width &#61; total_width / n plt.bar(x, gerenchengji[1:], width&#61;0.2, label&#61;gerenchengji[0],fc &#61; &#39;g&#39;) for i in range(len(x)): x[i] &#61; x[i] &#43; width plt.bar(x, pingjunchengji[1:], width&#61;0.2, label&#61;pingjunchengji[0],tick_label &#61; name_list,fc &#61; &#39;r&#39;) plt.legend() plt.show() plt.close()#打开Excel表格wb &#61; load_workbook(&#39;D:\成绩表.xlsx&#39;)sheet &#61; wb["Sheet1"]#平均分列表pingjunchengji&#61;[sheet["A5"].value,float(sheet["B5"].value),float(sheet["C5"].value),float(sheet["D5"].value),float(sheet["E5"].value)]#循环产生个人成绩列表for i in range(2,5): gerenchengji&#61;[sheet[&#39;A&#39;&#43;str(i)].value] for j in [&#39;B&#39;,&#39;C&#39;,&#39;D&#39;,&#39;E&#39;]: gerenchengji.append(float(sheet[j&#43;str(i)].value))#执行画图表函数 huatubiao(gerenchengji,pingjunchengji)
产生图表如下&#xff1a;
对学生成绩进行分析&#xff0c;超过80分并超过平均分为优秀&#xff1b;超过80分但小于平均分说明成绩普遍较高&#xff1b;小于80分大于60分且大于平均分&#xff0c;说明成绩普遍较低&#xff1b;小于80分大于60分且小于平均分&#xff0c;说明成绩有待提高&#xff1b;小于60分小于平均分则说明成绩较差。
姓名 | 准考证号 | 总成绩 | 计算 | 计数 | 数论 | 几何 | 应用题 | 组合 |
满分 | 300 | 20 | 40 | 60 | 60 | 80 | 40 | |
曲灵风 | 2020001 | 179 | 10 | 12 | 44 | 45 | 45 | 23 |
陈玄风 | 2020002 | 170 | 20 | 30 | 27 | 12 | 60 | 21 |
梅超风 | 2020003 | 264 | 20 | 40 | 55 | 55 | 60 | 34 |
陆乘风 | 2020004 | 255 | 19 | 34 | 50 | 43 | 74 | 35 |
编写思路&#xff1a;将学生成绩和平均分、满分对比&#xff0c;得到学生所在档次&#xff0c;分成levelA-levelE&#xff1b;判断所在档次输出不同信息&#xff1b;图表内容与案例5相似&#xff1b;最后以.md文件形式输出即可。
代码如下&#xff1a;
产生结果如下&#xff1a; 人生苦短&#xff0c;我用Python。除了自己使用&#xff0c;也可以教学生简单的使用。学习数学不就是为了学习解决问题的方法和探索不同的解决问题的方法么&#xff1f;谨以此文&#xff0c;供广大中小学数学同仁参考。from openpyxl import load_workbookimport matplotlib.pyplot as pltfrom pylab import * #打开要分析的Excel表格path_excel_input&#61;input("输入你要分析的数据表名称&#xff1a;")path_excel&#61;"D:\分数分析系统\\"&#43;path_excel_input&#43;&#39;.xlsx&#39;wb &#61; load_workbook(path_excel)sheet &#61; wb["Sheet1"] #定义成绩分析函数def fenxi(name): #获取标题栏 biaoti&#61;[] #标题列表 for n in sheet["1"]: biaoti.append(n.value) #获取满分列表 manfen&#61;[] for n in sheet["2"]: manfen.append(n.value) #满分列表 #使用传入的名字 name_chengji&#61;[] #个人成绩列表 k&#61;1 for i in sheet["A"]: if i.value&#61;&#61;name: for j in sheet[str(k)]: name_chengji.append(j.value) k&#43;&#61;1 #计算平均成绩 pingjun_chengji&#61;["平均成绩","/"] #平均成绩列表 for i in ["C",&#39;D&#39;,&#39;E&#39;,&#39;F&#39;,&#39;G&#39;,&#39;H&#39;,"I"]: sum_chenghi&#61;0 renshu_n&#61;0 for j in sheet[i][2:]: if j.value&#61;&#61;None: #判断表格数据不为空 pass else: sum_chenghi&#43;&#61;float(j.value) renshu_n&#43;&#61;1 pingjun_chengji.append(sum_chenghi/renshu_n) #计算最高分 max_chengji&#61;["最高分","/"] for i in ["C",&#39;D&#39;,&#39;E&#39;,&#39;F&#39;,&#39;G&#39;,&#39;H&#39;,"I"]: max_fen&#61;0 for j in sheet[i][2:]: if j.value&#61;&#61;None: #判断表格数据不为空 pass else: if max_fen max_fen&#61;float(j.value) renshu_n&#43;&#61;1 max_chengji.append(max_fen) #计算排名&#xff0c;从小到大 def paiming(a, list&#61;[]): list_sort &#61; sorted(list) paiming &#61; 1 for i in list_sort: if i &#61;&#61; a: return paiming else: paiming &#43;&#61; 1 #总分排序 zongfen_paixu&#61;[] for j in sheet["C"][2:]: if j.value &#61;&#61; None: # 判断表格数据不为空 pass else: zongfen_paixu.append(float(j.value)) paiming&#61;len(zongfen_paixu)&#43;1-paiming(name_chengji[2],zongfen_paixu) #对成绩进行分档 level_a&#61;[] level_b&#61;[] level_c&#61;[] level_d&#61;[] level_e&#61;[] def chengji_fenxi(biaoti&#61;[], xuesheng&#61;[], pingjun&#61;[],manfen&#61;[]): #成绩分析 #总成绩分析 for i in range(2,3): if xuesheng[i]>&#61;pingjun[i] and xuesheng[i]>&#61;manfen[i]*0.8 : zongchengji_fenxi&#61;"表现优秀&#xff0c;正确率在80%以上&#xff0c;高于全班平均水平。希望百尺竿头更进一步。" elif xuesheng[i]
小结