以图形牵引兴趣的Python案例教学方法与实践
2017-09-01黄天羽嵩天
黄天羽+嵩天
摘 要:针对目前程序设计课程的教学状况,分析学生在程序设计课程入门学习中的困惑,探讨将现有程序设计课程案例与图形相结合,提出“图形牵引兴趣,开展Python案例教学”的观点,并给出图形化入门程序案例、图形化程序结构案例、图形化数据结构案例、实际问题应用等,在程序设计入门教学过程中通过图形实现计算问题求解过程或结果呈现的多样化、可视化,以达到提高学生程序设计学习兴趣和培养现代计算思维的目的。
关键词: Python程序设计;图形教学;兴趣牵引;案例教学
0 引 言
Python语言是目前最接近自然语言的通用编程语言,它是程序设计课程教学改革的理想选择,是理解计算思维时代性的重要体现[1]。程序设计课程教学改革不仅仅是选择一种语言,更应该是建立一种易于理解、提升兴趣的教学形式。在教学方法层次上,教师应重视图形的作用[2]。我们生活在一个丰富多彩的图形世界里,学会利用图形分析和解决问题,既是现实生活的需要,又是图形编程的重要内容。在教学中,用图形的可视化手段辅助解决计算问题,在提升学生学习兴趣的同时,又有助于解决学习、生活及生产中的问题。
计算机显示技术给人们的生活带来了巨大改变。计算机用户接口的人机方式由最初穿孔纸带,经历了字符显示、文字显示、图形/图像、视频/多媒体,发展到今天全方位感知的虚拟现实技术。与此形成鲜明对比的是,当前程序设计语言教学案例依然沿用基于字符的人机接口。
Python语言提供了丰富的图形计算生态环境,借助第三方库可以方便地实现图形绘制、数据可视化、用户界面以及复杂的图形应用[3]。在Python教学中引入图形化手段[4],实现计算问题求解过程或结果呈现的多样化、可视化,可以达到增强学生程序设计学习兴趣、引导学生建立学习自信、培养学生现代计算思维的目的。
1 当前程序设计语言教学现状
自程序设计语言课程在我国高校开设以来,一直沿用以求解数学类问题为主的教学案例主线,典型例子如下。
(1)星号问题。编写程序,输出由星号(*)组成的菱形。
(2)温度转换问题。编写程序,转换摄氏温度为华氏温度,转换公式为C=(5/9)(F-32),其中,C表示摄氏温度,F表示华氏温度。
求解这些问题的共同点是对简单数学公式进行编程并计算结果。翻译成程序设计语言即通过定义合适的数学变量,建立数学表达式,将结果赋值给变量,最终输出计算结果。对于刚刚接触程序设计的学生来说,程序设计语言是一种全新的思维训练,也是计算思维习惯的培养过程。然而,枯燥的程序设计语言语法学习和单一形式的问题求解实践降低了学生的学习兴趣,并使得他们对程序设计产生了理想和现实差距的困惑。这些困惑反映了当前程序设计教学案例已经远离学生实际生活的事实。
2 以图形牵引兴趣
图形让现實生活变得丰富多彩。在教学中,用图形的可视化手段辅助解决计算问题,在提高学生学习兴趣的同时,又有助于解决学习、生活及生产中的问题。
2.1 教学案例的字符化与图形化对比
针对前文中的典型程序问题,在Python语言教学过程中,可以通过图形化设计将计算过程和结果以直观的可视化形式展示出来,其设计结果如图1和图2所示。将其与传统教学的输入输出设计相比,图形化的输入输出具有更好的理解性和直观性,同时对学生的学习兴趣也起到有益的引导作用。
在图1所示的星号问题案例中,主要考查学生对循环结构的理解以及输入边界条件的验证。虽然以星号排列组成的求解结果形式属于图形化的范畴,如图1(a)所示,但黑白颜色和“*”字符输出会让学生对图形理解产生障碍;而图1(b)所示的结果不仅在颜色上有丰富的变化,同时能更直观、更形象地帮助学生理解通过输入n值获得3~n边形的循环结构问题。
在图2所示的温度转换问题案例中,需要让学生实践C=(5/9)(F-32)数学公式的计算。图2(a)展示了以英文句子作为提示的输入方式;图2(b)给出了基于对话框的用户交互界面,在输入框中输入摄氏温度C值,在对话框中输出数值型华氏温度F值,同时对话框背景色根据当前温度的高低给出不同颜色暗示,第1张图表示温度越低,第3张图表示温度越高。图2(b)的图形化结果较图2(a)更加直观且考核了分支结构。这种运用色彩的方式使学生自身能产生与颜色值类似的感受,更贴近生活实际,与学生“学习程序设计语言,解决身边计算问题”的初衷一致。
2.2 Python的图形计算生态
Python语言具有开源、跨平台、脚本执行、通用等若干特点,1991年正式发布至今26年,迅速发展且得到普及和广泛应用。Python语言的开源思想深入发展,已构建了庞大的计算生态。目前,Pyton语言形成了约10万多个以开源项目为代表的第三方库,在图形和可视化领域也形成了庞大的生态社区,如Enthought公司提供了丰富的第三方图形库,Enthought社区也成为典型的图形计算生态圈。
Python语言的第三方图形库可以分为简单平面绘图库、GUI图形用户界面库、数据可视化库、图形/图像/多媒体库等几类,见表1。
2.3 教学案例的图形化设计
程序设计语言教学案例的图形设计不仅需要考虑程序设计结构的展示,还需要在求解问题的过程中引入图形化设计方法,辅助问题求解,更大限度地提高学生学习兴趣。图形化设计可考虑从以下4个方面展开。
1)计算问题求解结果呈现的多样化、可视化。
2.1节分别针对星号问题和温度转换问题开展了求解结果的图形化设计,求解结果直观生动、形式多样化。对于传统程序设计案例,可以通过Python语言第三方库改造,实现可视化展现。Python语言第三方库使用简单,案例中不应回避图形绘制,应尽可能利用图形化手段丰富求解结果的呈现效果。
2)程序设计教学与图形的结合。
程序设计语言的语法和程序结构是程序设计入门课程的学习重点。Python语言是一种重问题求解、轻语法的程序设计语言,其初衷是将程序员的主要精力放在问题求解上,因此,为了实现图形牵引兴趣的Python学习,应将程序设计教学的全部内容与图形相结合,包括程序设计结构、程序数据结构、算法设计等。
3)引入图形用以直观展示问题的求解过程。
很多实际问题在抽象成计算问题的过程中,会逐渐丢失直观的信息成分。通常数学问题的求解都是以理论推导为基础,相对于可视化而言,其求解过程枯燥、非直观,如递归类问题。通过引入图形手段,可以直观展示递归嵌套的逐级求解过程,这将帮助学生直观理解递归原理和具体运行过程。
4)实际问题应用的丰富多彩。
在个人计算机上运行的90%应用程序都具有丰富的可视化形象,一方面,体现在绝大多数应用软件都有美观的图形用户接口GUI,即软件界面;另一方面,很多实际问题的应用是基于计算机图形技术生成的,如图形艺术、图像处理、游戏设计开发、3D应用等。在信息类相关专业开展程序设计高级进阶课程教学时,应及时引入图形化编程,以完善程序设计的知识体系。
3 程序设计课程入门实例
3.1 开展图形教学可能产生的困惑
改变传统的程序设计教学案例,开展基于图形的程序设计案例教学,可能会给教师和学生带来以下困惑。
(1)初学程序设计的学生是否真的理解图形概念?调查表明,学生认为图形的人机交互方式远比命令行方式更好理解,因此图形将成为程序设计学习的辅助工具。
(2)使用Pyhon图形库需要多少程序设计功底?能否在入门课程中使用?Python语言的图形计算生态不仅提供了专业的第三方图形库,还提供了适用于入门学习者的第三方图形库,这使得编写Python图形程序非常简单,对于零基础入门学习者来说并不存在障碍。
(3)图形是Python可选的教学内容,还是必选的教学内容?没有图形支持的程序只能基于数字或字符,在计算机图形学和显示效果十分发达的今天,这种学习体验非常不利于学生保持学习兴趣。对于初学者来说,图形不仅是Python语言必选的教学内容,还是必不可少的教学手段。
3.2 第一个图形入门程序设计
我们通过引入第一个图形入门程序设计案例,分析图形对入门者的学习兴趣牵引作用。通常,程序设计语言教学的第一个入门案例都为“Hello World”,该案例通过执行输出语句,可以实现一个简单的计算机程序。然而,在调查中发现,完成这样的程序编写并不能给初学者带来成就感和学习信心,或者说从入门学习的兴趣牵引角度上来说,效果并不明显。
在教学实践中,设计了以Python(英文释义蟒蛇)为主题的小蛇绘制案例snake.py。该案例基于Python内嵌的Turtle库,在图形窗口中绘制了一条弯曲的蟒蛇,程序绘制结果如图3所示。Python的程序代碼如下:
#snake.py
import turtle #引入turtle库
def drawSnake(rad, angle, len, neckrad): #绘制小蛇函数
for i in range(len): #绘制小蛇身体弯曲的周期数
turtle.circle(rad, angle) #绘制正半圆
turtle.circle(-rad, angle) #绘制负半圆
turtle.circle(rad, angle/2) #绘制小蛇的脖子
turtle.fd(rad)
turtle.circle(neckrad+1, 180)
turtle.fd(rad*2/3)
turtle.setup(1300, 800, 0, 0) #建立窗框
pythonsize = 30 #设置画笔变量
turtle.pensize(pythonsize) #设置画笔粗细
turtle.pencolor("blue") #设置画笔颜色
turtle.seth(-40) #设置前进的朝向
drawSnake(40, 80, 5, pythonsize/2) #调用小蛇绘制函数
snake程序案例体现了较多程序设计元素,如第三方库的引用、变量定义、表达式、函数定义、循环结构等;同时,该程序还包含Python Turtle库的若干函数。在实践中,初学者并没有因为抄写15行陌生代码而退缩,正是由于Python语言重问题求解、轻语法的特点,学生更关注如何绘制出一条小蛇,而非每一个语句的语法。在完成代码抄写并成功运行程序的情况下,95%以上的学生认为通过编写代码绘制出一条生动的小蛇“有趣”“有成就感”,78%以上的学生认为自己对学好程序设计语言课程“有信心”。
在该程序中引入的Turtle库是一个适用于初学者的绘图库,通过模拟乌龟爬行释义实现图形的绘制,如turtle.fd()是沿着当前方向爬行/绘制一定长度的直线,trutle.pensize()是设置爬行/绘制路径的宽度。
4 开展Python图形案例教学
为了进一步探讨图形与程序设计语言教学的结合,我们针对程序设计结构、文件、字典和递归开展Python图形案例教学的设计。由于Turtle图形库易于理解,本节案例均基于Turtle库实现图形可视化,源程序可参考中国大学MOOC“Python语言程序设计”课程在线资源[5]。
4.1 图形与程序设计结构
程序设计的基本结构是程序设计语言教学的重要内容。结构化的程序设计提出了程序的3种基本结构,即顺序、循环和选择,它们控制了算法一系列操作的执行次序。在图形化程序设计结构中,教师可设计这样的案例:“编写程序,应用顺序、循环和选择3种程序基本结构,实现多边形绘制”。顺序、循环和选择3种结构的程序主要代码片段如下:
在程序实现上,通过顺序调用Turtle库中函数penup()、goto()、pendown()、circle()依次实现多边形的绘制,程序执行效果如图4(a)所示;通过循环结构,设置goto()和circle()函数的参数为循环变量,实现多边形的循环绘制;通过选择结构,根据输入的选择参数shape,有选择地进入不同的分支语句,执行多边形绘制。进一步,通过设置turtle的begin_fill()、pencolor()、end_fill()函数,可以为绘制的多边形填充颜色,程序执行效果如图4(b)所示,可使得图形结果更加生动、鲜明。该案例的设计可以让学生直观理解3种程序结构。
4.2 图形与文件
文件操作是程序设计入门课程的重要内容之一。图形化文件操作实例设计如下:读取文件data.txt数据,绘制数据形成的图形路径。图5(a)给出了文件data.txt示意,文件中第1行第1列数据300表示向当前方向前进300个像素,第2列数据0表示向左转,1则表示向右转,第3列数据144表示转动的144度角,第4、5、6列数据(1,0,0)表示当前绘制路径的颜色RGB值。根据该数据文件,可以动态地绘制出路径图形,如图5(b)所示。这是典型的基于文件数据驱动应用案例,是工程数据可视化、视频文件播放器等应用的极简设计。该案例不仅可以让学生练习文件讀取操作,还有助于学生理解基于数据驱动应用的实现原理。
4.3 图形与递归
递归是程序算法教学中重要的知识点,对程序入门学习者来说,递归概念抽象不好理解,采用可视化手段,求解过程就变得直观易懂。例如,递归案例“编写程序,运用递归方法绘制一棵树”,其程序执行结果如图6所示,利用Turtle的动态绘制机制,递归调用过程一目了然。
4.4 图形与字典
字典是Python语言特有的高级数据结构,是非序列集合而提供的一种数据类型。字典学习的经典程序案例是词频统计,通过图形化设计改造,教学案例设计为“读取一篇英文文章,统计文章中每个单词的出现频率,并以柱状图输出出现次数最多的10个英文单词”。程序执行结果如图7所示,与文字输出的结果形式相比,该图呈现效果更为直观。
4.5 丰富多彩的Python库解决实际问题
应用Python第三方图形库可以解决诸多实际问题,如图像处理、数据分析与展示、科学计算三维可视化、三维扫描数据处理、物理光照和全局光照、真实感图形绘制、视景仿真、及时战略游戏、FPS游戏、军事仿真应用等。
5 结 语
基于Python图形计算生态,我们提出了“图形牵引兴趣,开展Python案例教学”的教学观点,通过实现计算问题求解过程和结果呈现的多样化、可视化,将图形化教学案例设计思想引入第一门程序设计课程。实践表明,经该方法改造后的案例可以有效提升并使学生保持较高的学习热情、建立学习自信,达到进一步培养计算思维的目的。上述教学理念在北京理工大学7次课堂教学实践和中国大学MOOC多次在线课程教学实践中运用,取得了良好的教学效果。
参考文献:
[1] 嵩天, 黄天羽, 礼欣. Python语言: 程序设计课程教学改革的理想选择[J]. 中国大学教学, 2016(2): 42-47.
[2] 百度文库. 重视图形的作用[EB/OL]. (2014-12-22)[2017-06-20]. https://wenku.baidu.com/view/6e69ae188e9951e79b89278d.html.
[3] 中国大学MOOC. Python科学计算三维可视化[EB/OL]. [2017-06-20]. http://www.icourse163.org/course/BIT-1001871001.
[4] 嵩天, 礼欣, 黄天羽. Python语言程序设计基础[M]. 2版. 北京: 高等教育出版社, 2017: 46-55.
[5] 中国大学MOOC. Python语言程序设计[EB/OL]. [2017-06-20]. http://www.icourse163.org/course/BIT-268001.
[6] Mayavi. 3D scientific data visualization and plotting in Python[EB/OL]. [2017-06-20]. http://docs.enthought.com/mayavi/mayavi/.
(编辑:宋文婷)