问题驱动的Python编程教学

    韦胜洪

    

    随着新课标《普通高中信息技术课程标准(2017年版)》的实施,Python编程已成为高中信息技术课的重要内容。虽然编程学习过程中需要掌握一定的基础知识,但不应该只关注编程知识的记忆,而应该注重培养学生用编程来解决问题的能力。因此,围绕问题解决开展编程教学,既可让学生实践其编程技能,又可发挥学生在学习中的主体性,发展其高阶思维能力。所以,以Python编程为工具,设计问题驱动的教学具有较强的实用性和可行性。本文将以“帕斯卡概率游戏”为例,介绍此种教学的主要活动和流程。

    抛出问题,创设情境

    问题驱动的教学离不开一个好的探究问题,探究问题应当具备真实性、复杂性、趣味性等特点。真实性是指探究问题应该源于真实的生活实践,而不是胡编乱造,脱离实际。复杂性是指探究问题的答案不能是一目了然的,而是需要一定的探索和分析,最好是人工解决起来较为困难的类型。趣味性是指探究问题不能过于抽象化和学术化,要能够让学生有探究的兴趣。

    本文所选的“帕斯卡概率游戏”源于法国科学家、数学家帕斯卡与数学家费马之间的故事。故事发生在17世纪,在一位热衷于赌博的朋友影响下,帕斯卡和费马开始研究掷骰子的游戏。他们通过邮件讨论相关问题,并因此诞生了理论概率论。在教学中,笔者选取了其中一个游戏,让学生进行探究。游戏规则为:连续掷一个骰子4次,如果有1次出现6点,那么帕斯卡赢;如果没有出现6点,那么帕斯卡输。这里生发的探究问题是:如果玩这个游戏N次,最后谁胜率更高?这是一个源于真实情境的问题,而玩N次游戏很难人工完成,答案也并非一目了然。最重要的是,該问题本质上与数学的概率论相关,但是以游戏的形式呈现,能够激发学生探究的兴趣。

    分析问题,引出编程

    “帕斯卡概率游戏”虽然规则简单,但是理解其所隐含的概率问题并不简单。在教学实践中,笔者购买了骰子,让学生两两一组玩这个游戏,并提供数据记录表让学生记录游戏结果。因为时间有限,只让学生玩20次游戏,并报告帕斯卡和费马的胜率。在汇报游戏结果的同时,每个小组需要对探究问题(N次游戏后谁胜率更高)给出自己的结论,并做出猜想或者解释。让学生动手实践掷骰子游戏的过程,是为了让其能更加真实地感知问题情境,并在不断掷骰子的过程中熟悉游戏规则,为后面分析与解决问题奠定基础。通过这一环节,学生还会对探究问题形成一个初步的解释,这个解释并不是教师的灌输,而是他们自主探究得出的。

    在学生充分理解问题之后,教师需要从程序设计的角度带领学生进一步分析问题,首先,对探究问题进行抽象和分解,形成可编程的子问题。在本例中,对N次游戏进行模拟是解决问题的关键。当N很小时,可以通过真实的游戏实现,但其结果很难接近真实的概率;当N很大时(如100万),其结果会接近理论概率,而计算机模拟正适合这一情境。在这个环节,探究问题可以分解为三个子问题:①如何用代码模拟掷骰子过程?②如何模拟一个回合的游戏(掷骰子4次)并判定胜负?③如何模拟N回合的游戏并呈现游戏结果?其次,让学生分析和讨论程序代码的核心模块,也就是对程序代码进行规划。本例中,学生需要用Python编程语言来进行这一“翻译”过程。例如,第一个子问题可以使用Python随机函数包(random)实现。第二、第三个子问题需要使用循环语句、判断语句等基本语句实现。此时学生不需要完成代码的所有细节,而是要对程序有一个完整的规划。

    解决问题,测试代码

    在学生完成了初步的代码规划之后,编程环节可以正式实施。课堂组织形式仍然可以是两人一组,共同完成代码编写任务,该模式可以减少编程过程中的错误,提升编程效率。设计这一环节时,教师需要回答一个核心问题:是否给学生提供程序模板?如果学生的编程能力较好,可以让学生自己完成完整的程序,教师只提供适当的帮助。如果学生的编程能力较弱,教师可以根据学生的具体情况提供相应的“半成品”模板程序,为学生提供学习支架。上图为“帕斯卡概率游戏”的参考代码。其中7~11行代码是模拟一次游戏过程的函数,是整个程序的难点。教师可以在此增加注释、描述等文字,然后删除其中某一行,让学生填写缺少的代码。

    在程序完成之后,需要让学生对代码进行测试,并根据结果来回答探究问题。在本例中,运行程序之后学生会发现:①随着游戏次数增加,帕斯卡的胜率越来越稳定;②当进行100万次后,帕斯卡的胜率大约为51.8%。这也就找到了探究问题的答案:如果玩这个游戏N次,最后帕斯卡的胜率更高。然而,这只是用实验模拟的方法解决了问题,并没有从数学概率的理论角度阐释原因。此时,教师可以结合中学数学的概率知识,从理论上来解释程序结果。但这似乎超出了信息技术教师的能力范围。因此,在进行问题驱动的编程教学设计时,信息技术教师可以和学科教师组成备课团队,结合学科知识和编程内容,共同完成教学设计。这样,教学设计既能在信息技术课中实施,也可以在学科教学中应用,一举多得。

    拓展问题,迁移学习

    与传统的讲授式教学相比,问题驱动的教学能够实现有意义的学习,有利于学习的迁移。在学生利用编程解决探究问题之后,教师应该进一步抛出拓展性问题,让学生进行自主探究。这一环节一方面可以检验教学的效果,另一方面可以促使学生迁移应用已掌握的知识和技能。以“帕斯卡概率游戏”为例,探究问题为:如果玩这个游戏N次,最后谁胜率更高?这个探究问题虽然比先前的问题复杂度有所提升,但是有了先前的经验,学生能够自主探究完成。

    在选择拓展问题时,其跨度和难度变化不能过大。首先,拓展问题应当与先前的探究问题是同一类型的问题。本例中,笔者采用的都是基于“帕斯卡概率游戏”的概率问题,而如果拓展问题变为“草原生态平衡”模拟问题,跨度则过大,不利于学习的迁移。其次,拓展问题的难度应该略高于原先的探究问题。如果问题难度提升过高,学生可能没有足够的能力去完成自主探究。良好的拓展问题设计应该符合学生的最近发展区,也就是学生“跳一跳能够到”的范围。

    小结

    Python语言的易用性使其非常适合编程教学,而其强大的可扩展性又非常适合问题解决的教学情境。希望未来有更多教师尝试问题驱动的教学方法,并分享更精彩的案例。