朱苗祥 黄坚超
近年来,人工智能的发展十分迅猛,自从阿尔法围棋(AlphaGo)战胜世界围棋冠军之后,人工智能在社会上的热度持续不减。以Python为代表的人工智能编程语言凭借其语言本身的简洁易读性和可拓展性,辅以完善的基础代码库和丰富的第三方代码库,在人工智能领域受到了人们的青睐。我国部分省市已将Python编程纳入中小学课堂教学,广西现行教科版高中信息技术必修教材《信息技术基础》在讲到第三章第二节《信息的编程加工》时仍然采用了老版的VB语言教授计算机编程加工的过程。该课时教学目标是,通过让学生学习和运行代码,体验计算机编程的过程,了解计算机加工信息的内在机制和原理。本文执教教师在讲授该教学内容时,直接将教材中的VB语言换成了流行的Python语言,并以一系列有趣的程序编写为例,鼓励、指导学生通过模仿编写代码、尝试修改代码片段,不断激发学生的编程兴趣,提高学生学好编程的信心;学生在参与式学习过程中体验到编程的魅力,克服了畏难情绪,顺利达成了学习目标。
一、“刷脸”激趣,Python魅力初体验
师:(课件展示北京大兴国际机场航站楼外观图)同学们,谁知道图片上展示的是什么地方?
生:北京大兴机场。
师:对。这就是2019年9月25日开通运营的北京大兴国际机场。在这里,你可以体验到人脸识别技术所带来的便捷——值机、安检、登机均可通过“刷脸”来完成。大家有没有过类似的“刷脸”体验?
生:有,在超市购物自助买单时,可以用人脸识别完成支付。
师:的确,在我们的生活中,越来越多的场景已经用到了人工智能技术,比如通过手机拍照购物、AR扫一扫识别花卉、AI智能识别垃圾分类等。科技让我们的生活变得越来越便捷,你们知道吗,上面所列举的所有技术都离不开编程。有谁知道什么是编程吗?
生1:编程就是程序员写代码,比如C语言。
生2:还有C++、VB。
师:看来,你们对编程已经有了一定的了解。其实所谓编程,就是编写程序,用计算机可以理解的程序设计语言给计算机下达指令,让计算机执行某项特定的操作。今天,我们一起来学习时下最热门的Python编程。
师:请打开电脑桌面上的Python集成开发环境IDLE(师课件展示IDLE图标,学生打开该图标)。
师:接下来大家跟着我一起输入代码。先输入import turtle,然后按回车键。有什么现象发生吗?
生:没有。
师:确实没有。大家先来猜一猜这行代码是什么意思?
生1:进口乌龟。
生2:乌龟重要性。
師:从字面上看,似乎有这层意思,但是,在计算机科学中,它的意思是“导入海龟库”,你也可以想象成“召唤神龟”(生笑)。虽然计算机现在没反应,但其实“神龟”已经被“召唤”成功,我们之所以没看到什么反应,是因为“神龟”不知道自己该以什么样的形态出现。于是,我们需要给出第二条代码指令,比如turtle.shape(“turtle”),然后按下回车键。(生操作)有什么事情发生吗?
生:出现了一只乌龟!
师:是的,我们编写的代码开始发挥作用了。第二行代码直接翻译过来就是——神龟.形状(“乌龟”)。前面的turtle指向被我们召唤的“神龟”,shape是“形状”,括号内的turtle指的是“乌龟”,连起来看,这一行代码就是告诉计算机,你要召唤的“神龟”要以乌龟的形状出现。请查阅桌面上的技术文档(生打开表1),找到turtle.shape(name)这条命令。
生:找到了。
师:我们可以看到,“神龟”指定的形状有6种。也就是说,我们还可以从另外5种形状中选一种来替换括号里的“turtle”,那它就会以另外的形状出现了。
师:我们继续输入第三行代码——turtle.forward(150),按回车键。
生:乌龟往前移动了,还画了一条线!
师:这是因为,这条代码里的forward,是你通过计算机给乌龟发出的“往前移动”指令,所以它就往前移动了。如果我想要屏幕上的这只乌龟画出一个正方形,接下来的代码该怎么编写呢?
生1:turtle.up(150)。
生2:turtle.down(150)。
师:你们先自行验证一下吧!
生:错了,出现了一堆红色的英文……
师:错在哪里呢?从我们的角度看,想要画出一个正方形,确实应该让乌龟向上或向下走,可是对于计算机程序来说,这条命令是发送给乌龟的,此时的参照物便是乌龟,而乌龟只能是向左或向右了。所以,接下来的代码,大家会写了吗?
生1:会了。turtle.left(150),或者turtle.right(150)。
生2:不对,不是150。
师:那应该是多少呢?
生2:应该是90。但是,乌龟只是转了一下方向,没有往前走……
师:看来你已经验证过了(竖大拇指表扬)。不过,至少乌龟已经转了方向,那接下来该怎么写呢?
生:turtle.forward(150)。
师:非常好!看来你们已经慢慢摸索出门道了。大家再想一想,我们为什么要用两条命令来完成一个向左150或向右150的动作呢?(生思考)原来,在日常生活中,当我们给人指路的时候,我们所说的“向右直走150米”其实是一个“复合”命令,人脑可以迅速识别该复合命令并去执行,于是就想当然地把它当成了“一个”动作指令来完成了。但是,我们现在的指令不是给人,而是给计算机中的乌龟的,需要用乌龟可以理解的计算机程序语言。计算机程序运用的是“分而治之”理念,每一条指令只能负责一个简单的动作。因此,我们必须把上面的“复合命令”分解开来——先向右转90度,再直行150个单位。
师:请继续查阅技术文档,找到turtle.right(angle)命令。
生:找到了。
师:在turtle.right(angle)命令中,angle是一个参数,指的是所转的角度。right(angle)有点类似于数学中的sin([θ])。right( )就相当于数学函数sin( ),而angle就相当于[θ],当angle=90时,也就是turtle.right(90),即向右旋转90度。前面的turtle.forward(distance)命令中,distance也是一个参数,相当于数学函数[f(x)]中的[x],可以看成是turtle.forward(x),当[x]=150时,turtle.forward(150)便是向前移动150个单位的距离。技术文档里还有很多命令函数,括号里的参数虽然看起来复杂,但其实就如数学函数中的自变量,只不过命令函数里的参数通常都是一些英文单词、单词缩写或词组缩写等,而数学函数中通常为单个的英文字母或者特殊符号——这些都只是习惯的问题,大家适应一下,稍加转换就能理解了。学会了看技术文档里的技术术语,再学习编程就不难了。
师:那接下来的代码大家都会写了吗?
生:会了。
师:老师给大家一个提示。画这个正方形时,它的代码主要是forward和转向,再forward再转向,都是一些重复的代码,我们可以用“复制—粘贴”的方式完成以上重复的过程,提高效率。开始补充代码吧!(生自主完成让乌龟画正方形的编程过程,乌龟画图过程如图1)
【评析】用贴近生活的例子导入,可以引发学生对计算机编程的兴趣;再启动turtle这个简单的绘图工具,让学生在尝试、体验中渐渐悟出计算机语言的特点,知道代码编写的意义,并在自主完成学习任务的过程中增强学好编程的信心。
二、举一反三,层层递进,让学生习得方法与技能
师:刚才大家通过自己的努力,成功地命令乌龟画出了一个正方形,了不起!个别同学在编写代码的过程中已经发现,如果某个地方输错了一两个字母,想回头去改却是不行的,只能重新输入一整行代码。这是因为,IDLE环境主要用来演示一些简单代码的执行效果,以及对少量代码进行调试,每写一行代码都能立刻看到该代码的执行结果。而一般的编程开发,都是将代码写在一个文件里。下面就请同学们通过双击鼠标左键打开文件“1.py”。
生:哇,它自动画了一个正方形。
师:对,这才是一个完整程序所应有的样子。下面我们来看看它的代码是怎样写的——在文件上单击鼠标右键,移动鼠标到“edit with IDLE”,然后点击右边展开的菜单“edit with IDLE 3.6(64-bit)”。
生:打开了,里面的代码(如图2)跟我们之前输入的差不多。
[import turtle
turtle. shape("turtle")
turtle. forward(150)
turtle. right(90)
turtle. forward(150)
turtle. right(90)
turtle. forward(150)
turtle. right(90)
turtle. forward(150)
turtle. right(90) ]
师:是差不多,只是运行方式不一样。这是一套完整的代码,这时该怎么运行它呢?可以点击菜单栏上的Run命令(如图3,生依次完成操作),然后单击RunModule,或直接按F5键。
师:现在老师想用这个程序画一个正三角形,请用“1.py”代码为基础来修改程序。(生尝试操作,师巡堂)
师:老师发现,同学们都改对了。个别同学一开始改错了,后来又改对了。改错的同学,你们刚开始改成了什么?
生1:把turtle.right(90)改成了turtle.right(60),实际应该是120。
师:为什么呢?因为这里的角度并不是我们所画三角形的内角,而是乌龟旋转时的角度,也就是三角形的外角,所以应该是120度。如果老师让大家把这段代码改成一个正五边形,又该怎么改呢?
生:把右转的角度改为72,然后复制粘贴forward的那行代码。
师:正确!我们知道,多边形的外角和是360度,正五边形的每个外角就是360÷5=72(度)。所以右转的角度就应该是72度。我们原来的程序只画了4条边,这时便需要再加上一条边。接下来,如果要你们画一个正一百边形怎么办?
生:啊?!要復制那么多次啊?
师:这样的话,效率就太低了。我们来看第二个程序,请大家打开文件“2.py”,运行一下这段代码(如图4),看看它是用来做什么的。
[import turtle
turtle. shape("turtle")
for x in range(4):
turtle. forward(150)
turtle. right(90) ]
生:咦,也是画一个正方形!
师:跟前面编写的代码有些不同了。仔细看看这条代码,哪些地方可能跟边数有关?
生:“for x in range(4)”,括号里有个4。
师:很好!如果改成画正五边形的代码,怎么改?
生:把“4”改为“5”,再把下面那一行中的“90”改成“72”。
师:这样是不是比之前快多了?
生:是。
师:要改画正一百边形,是不是也不难了?
生:嗯,只要改两个地方就行。
师:这就是代码的力量。如果我要大家把这个代码改成画一个正五角星,那又该怎么改呢?
生:(思考后回答)for那行括号里改为“5”,右转的角度改为“144”。
师:非常棒!那就开始操作吧。(所有学生按要求修改程序后,依次得出了如图5所示的相关图形)
师:大家可以看到,五角星的内部有一个正五边形,他们的两个外角正好是一个三角形的两个内角,这两个内角之和就是72+72=144(度)。三角形的一个外角等于与他不相邻的两个内角的和,所以我们得出外角为144度,也就是乌龟转过的角度。看来大家已经掌握了用这种代码绘制一些规则图形的技巧了。
【评析】以上教学环节环环相扣、层层递进。教师通过设置一个个难度递进的小任务,引导学生尝试自行修改代码,从中习得方法与技能,收获一个又一个惊喜,成就感油然而生,自信心逐渐增强。
三、自主探究,猜想验证,培养学生学科学习品质
师:请大家打开文件“3.py”的代码,然后运行这段代码,看看它是用来做什么的。
生:正方形螺旋线。
师:没错,这段代码里面绘制长度的代码是“forward(x)”,也就是说,forward的距离是不固定的,每次都会变化一点。请大家尝试自由修改这个文件里的代码,看看还能画出什么样的图形来。(学生尝试自由修改代码,师巡堂)同学们都在修改代码了,并且画出了好多图形,看看(展示学生的作品,如图6),多漂亮!
师:现在再来看文件“4.py”里的代码,然后运行这段代码,看看又有什么事情发生。(生运行代码,如图7)
[import turtle
turtle. shape("classic")
turtle. speed(0)
colors=["red","yellow","green","blue"]
for x in range(100):
turtle. pencolor(colors[x%4])
turtle. forward(x)
turtle. right(90)
师:你们能找到那些与线条颜色有关的代码吗?
生:colors,还有pencolor。
师:很好。接下来,你们就可以将自己在前面画的那些图形改成彩色线条了,试试吧。(生自主尝试,收获更多惊喜)
师:现在请打开并运行文件“5.py”里的代码(如图8)。
生:背景颜色变成了黑色。
[import turtle
turtle. shape("classic")
turtle. speed(0)
turtle. bgcolor("black")
colors=["red","yellow","green","blue"]
for x in range(100):
turtle. pencolor(colors[x%4])
turtle. forward(x)
turtle. right(90)
师:哪一句代码是修改背景颜色的?
生:bgcolor(“black”)。
师:根据“black”这个单词,我们很容易猜到是这句代码改变了背景颜色。为了验证猜想,我们可以尝试将代码里的“black”修改为其他颜色,看看背景颜色会不会跟着改变——如果变了,说明背景颜色的确与它相关;如果没有变化,那就去找其他代碼。
生:(尝试改变为其他颜色词语)变了,就是它!
师:在技术文档里,这个代码的确就是用来控制背景颜色的,bgcolor其实是backgroundcolor的简写。同学们在初学编程的时候,要勇于猜想、细心验证。只有这样,才能对知识有更深的理解和记忆。
【评析】计算机编程用的都是英文,学生初次接触这个内容,对编程语言还比较陌生。教师通过给出一些相近的代码,鼓励学生大胆尝试、比对、猜想、验证,最终发现导致运行结果不同的代码,再告诉学生这个代码的真实含义。这样的教学过程,不仅使学生对知识的理解和记忆更为深刻,而且有效培养了学生勇于猜想、细心验证的学习品质,进一步增强了学生的学习信心。
四、开拓视野,呈现更多富于趣味性和实用性的编程技术,开启面向未来的探究学习
师:现在,同学们对编程已经有了初步认识。部分同学甚至可以按照自己的想法编写代码了。老师这里还有几个小程序,大家可以运行一下。感兴趣的话,还可以打开代码看一下。比如运行“6.py”。
生:(运行“6.py”,如图9)哈哈哈,佩奇,是小猪佩奇!
师:用程序画画,比我们好多人画得都要好。
生:(打开该程序代码)可是,代码好长啊!
师:是的,想要做一些更有趣更实用的程序,的确需要编写较多的代码,而且必须学习更多的编程知识。编程不仅有趣,而且充满智能,还非常实用。
接下来,教师让学生依次运行“7.py”“8.py”“9.py”,开始从趣味性向实用性过渡。学生运行“7.py”,可以看到图片中的人脸都被一个框图框住,这就是说,程序已经识别出了人脸;运行”8.py”,可以看到人脸上有了好多点,这是人脸的特征点,电脑程序正是通过这些特征点来辨认人的眉、眼、鼻、口的;运行“9.py”,可以发现程序已经识别出了照片中的人,标注了人的姓名(如图10)……“9.py”的原理是,利用上一个程序的人脸特征点跟已知图片中的人脸特征点进行比对,便可以认出这个人是谁。
课堂接近尾声,教师运行摄像头实时人脸识别程序,并请出一名学生。先让摄像头识别该生,显示“未知”二字,然后教师近前,对着摄像头左右移动头部:咦,它认出了老师!即使老师在晃动,还是被它认了出来,并标注了姓名。这背后的原理,自然是学生的资料图片没有加入相关图库,所以程序无法识别;而老师的图片,已经提前输入了图库。
最后教师总结:超市的人脸识别支付、北京大兴机场的人脸识别自助值机等,都是利用了类似的原理。其实,人工智能也是按照人类编写的程序所规定的内容和步骤,一步一步地工作的。编写程序的过程,可能会遇到各种各样的错误,需要不断改正错误,才能让程序正常运行。因此,人工智能的学习,需要我们在错误中积累经验,不断成长。Python初体验,这节课就上到这里,下课!
【评析】小猪佩奇和人脸识别,这些贴近学生实际生活的例子,更能激发学生的探究兴趣,也因此更具现实意义。教师通过以上例子,向学生进一步打开编码技术的大门,告诉学生编程都能做些什么,从中展示了编写代码的实用价值。然而,这些更具实用价值的例子,其代码编写相对来说也复杂得多,执教者没有像前面那样,让学生打开代码、尝试修改,而是完全避开了代码内容,只是让学生体验程序运行的效果,感知人工智能的“能耐”,进一步提高学生对编程学习的兴趣。作为编程体验课,这样的处理,有效降低了学生的学习难度,让学生保持了较高的学习兴趣。
【总评】
本课所选编程语言Python,虽然已火了好多年,但至今仍未纳入我区的高中信息技术教材。这节课为一线教师提供了一种开展Python教学的方法。对于很多人来说,学习编程是枯燥乏味的。如何激发学生对编程学习的兴趣,帮助他们克服畏难情绪显得尤为重要。本课综合运用各种教学方法和手段,尽可能地吸引学生,全方位、多角度地提高学生学习编程的兴趣,具体体现在以下几个方面:
1.降低入门难度。绝大多数高一学生对编程和Python语言都很陌生,在本课中,教师利用Python语言中简单易学的turtle函数库,通过函数指令的控制,让海龟在平面上移动并绘制图形,学生只需编写几行简单的代码就能完成以上任务并画出生动有趣的漂亮图形,有效消除了學生的畏难情绪。
2.融合数学知识。数学的发展催动了计算机技术的发展,编程离不开数学知识。执教者在一个个小任务中融入数学知识,对学生信息素养与计算思维的提升起到了很大的促进作用。在教师的引导下,学生自行修改代码并完成了所有的任务,问题由易到难,层层递进,学生所绘制的图形也越来越复杂、漂亮,成就感油然而生,自信心逐渐增强,学生对后续的编程学习甚至充满了期待。
3.选择有效策略。这是一节编程入门课程,执教者没有直接提概念,而是提出一个个的问题供学生解决,让学生在问题解决的过程中学会编程的语法和专业术语。比如让学生在还不知道语法的情况下找出某段代码的作用,要求学生根据某段特定代码改写出一些新的代码等。
4.增添教学趣味。有趣而丰富的几何图形、小猪佩奇、人脸识别等都很好地吸引了学生注意力,活跃了课堂气氛,学生的学习效率极高。课堂教学中,生动有趣的教学例子,能够极大地提高学生的学习兴趣,激发学生的学习热情。
注:该课例曾获2019年全区中小学信息技术与学科教学深度融合优秀课例展示观摩评选活动高中信息技术组一等奖。
(责编 白聪敏)