Python程序设计教学中学生计算思维培养策略
——以编写“猜数字”游戏为例
2022-08-18王文静江苏省南京市中华中学上新河初级中学
王文静 江苏省南京市中华中学上新河初级中学
陈澜 南京师范大学附属中学新城初级中学
培养学生的计算思维是使其掌握信息技术学科大概念自动化的必要前提。同时,计算思维作为一种思维方法,可与其他核心素养紧密结合,促进信息技术核心素养的全面发展。笔者根据多年教学经验发现,在初三年级学生的思维活动中,抽象思维已经占据了首要位置,且更多属于经验类型的范畴,其特点是需要用感性经验为抽象思维活动的开展提供直接支撑。因此,作为计算思维技能的五大要素之一,抽象思维能力的强弱直接影响学生计算思维的形成和计算思维能力的发展,所以,教师在开展Python程序设计教学时,应将源于生活的问题作为课堂教学的情境,进而为学生抽象思维的运用和发展做好铺垫。
下面,笔者以编写“猜数字”游戏为例展开分析。本节课是基于计算思维视域下的Python程序设计教学,是以培养学生计算思维为主要目标而开展的课堂教与学活动。
● 片段一:分析问题
教师邀请两位学生演示“猜1到100之间数字”的游戏,教师板书猜数字的过程,其余学生观看。教师提出问题:“如何利用Python语言编写猜数字游戏的程序?”并进行如下引导。
师:要想用Python编写猜数字的游戏,首先要从程序设计的角度理清问题。所以,这个问题的表述应该是:计算机产生一个1到100的随机整数,然后用户猜测,直到猜出数字,程序结束。为了简化这个问题,我们能不能分解一下?
生:可以分成两个部分,一是计算机产生一个随机数;二是猜数字。
师:很好,确实可以这样分解问题。不过,好像还没有分解到位。第二部分是否还可进行再次分解,让我们更清晰地知道用户与计算机之间是如何互动的?
学生尝试回答问题。
师:通过同学们的踊跃回答,再次分解后的结果已经出来了。猜数字这一部分分解为:①猜测一个数;②当猜测的数大于产生的随机数时,计算机提示“大了,请重新猜”,再次猜测;③当猜测的数小于产生的随机数时,计算机提示“小了,请重新猜”,再次猜测;④当猜测的数等于产生的随机数时,计算机提示“猜对了”,游戏结束。不过这样的表述看上去还是复杂了一点,没有一目了然的感觉。那么,如何将分解后的问题直观、清晰地表达呢?
生:删除一些文字,可以按条目列出来。
师:在数学里求解应用题的时候,解题步骤是怎样的呢?
生:删除不必要的信息,设未知数,列出表达式。
师:对嘛!其实这就是删除不必要的细节,利用符号表达,用符号表达问题的过程就是对问题认知抽象的过程。下面,我们尝试使用符号表达分解后的问题。我先带领同学们完成第一部分和第二部分的第一块,剩下来的请同学们来告诉我如何抽象问题,以降低问题的复杂性。第一部分产生一个1到100的随机整数,可以表述为1<=num<=100;第二部分的第一步可以表述为2.1 guess?。剩下来的,请同学们告诉我。
生1:2.2 guess>num print(“大了,请重新猜”) again 2.1
生2:2.3 guess<num print(“小了,请重新猜”) again 2.1
生3:2.4 guess==num print(“猜对了”) over
教师板书经抽象后问题分析的结果。
此教学片段是分析环节,在此环节着重训练学生对问题分解的能力和分解问题后抽象的能力。为将现实生活中的两个人玩的猜数字游戏做成一个人也可以玩的计算机游戏,需要教师带领学生进行问题分析,第一步就是要将这个问题分解为不同的组成部分,以方便后续的问题处理。教师先引导学生将猜数字游戏分解成两大部分,再将第二部分分解成四个小部分,与此同时将分解后的结果板书。观察板书发现不够一目了然,通过与数学中应用题的解题策略类比,将解决方案从数学的问题情境中转移到程序设计的问题分析中,删除不必要的细节并使用符号化的表达式来描述问题分解后的过程,进而降低问题的复杂性。在此过程中,从程序设计的一般步骤层面来说,学生完成的是对问题的分析;从计算思维培养的层面来说,学生重点发展了分解和抽象的能力。
● 片段二:算法设计
师:同学们,按照程序设计的一般过程,在问题分析后应该做什么?
生:算法设计。
师:同学们看一下问题分析的结果,是不是觉得猜数字游戏的算法已经非常好设计了?请大家告诉我,算法在哪里?再看一下流程图,思考其是否正确描述了猜数字游戏的算法?
学生观察流程图,思考并回答问题。
生:流程图有问题,这个流程图只能执行一次就结束了。
师:是的,这个流程图只能执行一次就结束了,也就是说用户只能猜一个数字,无论猜测正确与否程序都会结束。该如何解决这样的问题呢?在前面的学习中,我们已经基本了解并掌握了程序设计中的两种基本结构——顺序结构和选择结构,为了解决现在这个问题,我们需要学习程序设计的第三种基本结构——循环结构。循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构,它由循环体中的条件判断继续执行某个功能还是退出循环。循环结构可以看成是一个条件判断语句和一个向回转向语句的组合。循环结构在程序框图中是利用判断框来表示,判断框内写上条件,两个出口分别对应条件成立和条件不成立时所执行的不同指令,其中一个要指向循环体,然后再从循环体回到判断框的入口处。
教师演示循环结构流程图动画,学生听讲、观察,完成对循环结构流程图的学习。
此教学片段主要描述的是编写猜数字游戏的算法设计环节。因为在问题分析完成后此程序的算法已经基本清晰,故本节课的算法设计部分是教师带领学生从评价一个不完整的流程图开始,学生通过观察、思考、评估流程图执行的结果发现存在的问题,进而引发认知冲突并激发求知欲。从教学逻辑上说,在算法设计环节中,为能够绘制循环猜测直到猜出正确数字的流程图,学生需要了解程序中循环结构的含义并掌握流程图中循环结构的表示方法;从计算思维培养上看,能够评估算法的正确性并发现算法可能存在的问题是对学生评估能力第一层次的培养与锻炼,学习绘制循环结构流程图并利用流程图描述问题解决的具体步骤是对学生算法能力第一层次的训练与巩固。
● 片段三:知识铺垫,掌握while语句
师:同学们,我们已经完成了程序设计一般过程的第一步和第二步,下一步是什么?
生:编写代码。
师:不错,是编写代码,但最好这样表述:按照算法编写代码。编写这个程序对同学们来说唯一的难点是如何实现循环结构。我们本节课学习利用while循环语句编写程序实现程序的循环结构,这既是本节课的学习难点,也是学习重点。我们知道学习Python语法的方法很简单,有着固定的步骤和方法。请一位同学告诉我,在学习if语句时,是按照什么样的步骤和方法熟悉和掌握if语句的语法的?
生:第一步,认真阅读if语句的语法格式;第二步,阅读if语句的应用样例,参照样例程序编写、修改变量数值并观察结果;第三步,尝试编写一个简单的应用if语句的程序,调试并得到正确结果。
师:很好!同样地,为了了解、掌握while的语法格式并能应用while语句编写猜数字游戏,请同学们打开学件参照学习if语句语法格式时的过程和方法,尽快了解和掌握while的语法格式。
本教学片段是概括能力的培养与训练。对“概括”能力的训练需层层递进,从发展学生识别问题共性的能力开始,逐步过渡到帮助学生能够修改某一问题的解决方案使之解决类似的问题,最后使学生能够将解决问题的方案从一个情境顺利转移到其他情境中,并使得问题得以解决。
● 片段四:按照算法编写代码,实现猜数字游戏
师:编写猜数字游戏的知识储备已经完成了,现在请同学们按照流程图编写代码,并测试结果。
学生编写代码。
师:有没有同学编写的程序能够正确运行?
生:老师,我的程序可以正确运行,不过只能猜一次数字。
师:思考一下原因是什么?是不是流程图中的算法有问题?
生:老师,我知道了,流程图中只有判断数字是否相等,但判断结束后没有再次输入数字的地方,所有按照这样的算法编写的程序只能够判断一次。
师:不错,请大家修改算法,然后编写代码,测试程序是否符合要求。如果你认为目前的算法不够简洁请自行修改、编写代码并测试程序。我们可以对while语句想想办法(提示)。
生:我觉得循环语句中对输入数字大小的判断用一个双分支结构就可以了,没有必要用两个单分支结构,也就是说用一个if…else取代两个if语句。
师:很好!这样做精简了代码,逻辑上更清晰。还有没有?
生:我用了另一种更简单的方法。学习材料中有while与break结合的样例,所以我的循环体第一行是while 1:,这样循环就可以一直存在;第二行是input函数,这样整个程序就不需要使用两个input函数,可以减少代码的行数;在第三行中使用if…elif…else语句,if用于判断是否大于,elif用于判断是否小于,else后直接break一下,因为排除大于和小于这两种情况后就只能等于了。跳出循环体后,程序的最后一行直接输出“猜对了”就可以了。
师:非常棒!你观察敏锐,活学活用,用精练的算法解决了这个问题。同学们在完成自己的代码后,可以尝试这位同学的算法编写程序并测试结果。
在此教学片段中,学生按照算法设计环节中绘制的流程图编写代码会发现并不能得到预想的结果,需要再次评估原先的流程图,发现其中的问题并进行修改以得到正确的结果。随后,教师要求学生观察已经编写的代码,结合选择结构程序设计的相关语法以及本节课所提供的学习材料思考能否优化程序,引导学生借此反推,修改原有流程图,使得猜数字的流程图更加简洁,同时也使得所编写的程序更加优美。