肖胜刚++袁方++安海宁
摘 要:针对大学计算机基础课程培养学生计算思维能力的目标,分析Python语言的优势,探讨Python作为程序设计课程教学语言如何培养学生的计算思维和创新能力。
关键词:Python;计算机基础课程;计算思维;创新能力
1 背 景
自2006年卡内基 ·梅隆大学周以真(Jeannette M. Wing)教授提出并阐释了“计算思维”[1]概念以来,把培养学生计算思维能力作为目标已经成为大学计算机教育工作者的共识[2]。计算机基础课肩负着培养大学生——特别是非计算机专业大学生计算思维能力的重要责任,同时,计算机基础课也肩负着培养大学生创新能力的责任[3-4]。《大学计算机基础课程教学基本要求》(2016版)指出:计算思维的核心概念是经过高度概括和理论总结的,还不能成为直接的教学材料,其培养要渗透在传授学科知识、训练应用能力的过程中[5]。计算机教育工作者在“计算思维”概念落地上进行了广泛而深入的研究与探索。程序设计自身具有逻辑严谨、实践性强的特点,适合作为加强培养学生计算思维能力的课程,也适合学生依托程序设计实现专业构思、解决专业问题,培养和提高自身的创新能力。
2 Python语言的优势
当前,大学计算机程序设计类课程可供选择的高级语言种类很多,常见的包括C、C++、C#、Java、PHP、Basic、Python等。这些编程语言各有其特点和应用领域。不同编程语言的学习难度曲线也各不相同。对于低年级大学生,尤其是非计算机专业的学生,选择一门入门难度低、学习难度曲线适中、功能强大、应用范围广的程序设计语言非常重要。
Python语言由荷兰人Guido van Rossum于1989年设计,并于1991年发布第一个版本[6],其最新版本为3.x。Python语言语法简洁、清晰、易读,具有丰富和强大的类库[7],应用非常广泛,是一门非常适合低年级及非计算机专业大学生学习、培养其计算思维和提高创新能力的编程语言。
2.1 语言特点
Python是一种解释性的编程语言,其特点是轻语法、重解决问题。Python语言的设计哲学是简洁、优雅、易使用。这决定了学生在学习Python时,学习难度曲线起点低,容易入门。为了保证Python程序代码的优雅性和易读性,Python语言采用强制缩进方式,易于学生阅读和学习他人的代码。
在使用计算机程序解决实际问题时,编程语言本质上是解决问题的工具,问题能不能被解决,更多的在于解决问题的思路和专业知识,编程语言在解决实际问题时的作用是浮在水面上的冰山一角,水面之下看不到的大部分,是解决问题所需的专业知识和能力。Python语言正是这样的一种工具,易学、易用、使用范围广。借助计算机程序解决实际问题时,可以让学生将更多的精力放在要解决的问题上,而不是将大量时间耗费在学习语法知识及其使用等内容上。
2.2 开发环境对比
相对于其他编程语言,Python拥有对于初学者安装和使用更简单、更友好的集成开发环境。随着高级编程语言的发展,很多编程工具本身功能越来越丰富,配置上、使用上越来越复杂,用户投入在掌握开发工具使用上的时间和精力越来越多,学编程语言变成了学编程语言工具的配置和使用,反而忽略了程序设计语言本身的很多内容。更不用说学完语言之后,还要将所学的编程语言和自己要解决的实际问题关联起来。
Python语言本身是开源的,开发环境种类众多。对于有经验的开发人员可以选择PyCharm等高级集成开发环境,功能丰富、易于调试。对于初学者,Python语言自身所带的集成开发环境(Integrated Development Environment,IDLE)基本可以满足其学习Python语言所需的一切功能。IDLE随用户安装Python语言自动安装,安装完成后无需任何配置,打开即可使用。IDLE是图形化界面,既可以在其Shell窗口中逐条指令交互式执行验证Python语句,也可以在IDLE的编辑窗口中书写保存并运行大段Python程序代码。
2.3 类库支持
Python语言的优势还体现在类库丰富、应用广泛上。目前,Python语言拥有各类包库超过10万个[8]。这使得Python语言在教学时可以适用于各专业各层次的学生。网络爬虫既有相对容易的Requests库,也有专业的Scrapy爬虫框架;绘图可以使用相对简单的、内置的turtle库,也可以使用知名的二维绘图Matplotlib库;进行科学计算有NumPy库;中文分词有jieba库;深度学习有著名的TensorFlow框架;与其他硬件串口通讯有PySerial库。Python构筑了一个积极而又健康的计算生态圈。
3 教學实践
2017年春学期, Python语言程序设计课程被确定为我校通识通选课程。我们本着“夯实基础”“自主发挥”和“引导创新”的思路, 对学生计算思维能力和创新能力的培养进行了一些实践和探索。本课程共68学时,上课17周,每周理论教学课程和实践教学各2学时。
3.1 Python语言语法的快速学习
快速有效地夯实Python语言基础,才能够使学生尽早地借助Python工具解决实际问题,培养计算思维和创新能力。结合Python语言的特点和集成编程环境IDLE简洁良好的交互体验,本课程精炼学生应掌握的Python最基础语法知识,在Python语言语法学习上,共安排6周(12个理论课时和12个实验课时),构建学生使用Python语言解决实际问题的最基本知识体系。课时安排见表1。
表1 基础语法学习课时安排教学周 理论课程 实践课程
第1周 课程概论和Python安装 Python安装和示例类程序
第2周 基本数据类型、格式化输出和使用库 数据类型转换、数据输出习题,使用math库endprint
第3、4周 顺序、选择、循环结构 以选择和循环为主的练习,如π的运算
第5周 组合数据类型(列表、元组、字典)和函数 组合数据类型强化练习,列表排序,函数基础
第6周 文件类操作 文本文件的读取和写入
经过6周24学时的强化学习,在第7周安排Python语言基础知识测试,主要考核Python语言的简单判断结构、单层循环结构和格式化输出等知识点,全班共计90人,满分人数8人,占8.9%;85分(含)以上27人,占30.0%;60分(含)以上76人,占84.4%。由此可以看出,Python语言作为程序设计语言,入门相对比较容易。学生掌握了Python语言的核心语法内容,就拥有了阅读别人代码的能力,也拥有了使用Python语言尝试解决实际问题的能力,同时也就拥有了深入培养计算思维和进行创新的能力。
3.2 MOOC + SPOC + 翻转课堂
为了给学生提供更多的学习资源,让学生能够更好地利用智能手机和零碎时间进行学习,本课程引入了北京理工大学嵩天副教授团队在中国大学MOOC网开设的Python语言程序课程[9],并建设了我们自己的SPOC课程。学生在课前预习遇到问题时,首先观看MOOC和SPOC上的视频和课件资源;在课后复习和完成作业遇到困难时,反复回看MOOC和SPOC上的资源,积极参与网上的讨论,扎实掌握Python语言。这种新型的教学方式和网络资源,极大地改变了学生的学习模式,提高了学生的学习积极性和学习兴趣,并很好地利用了手机和学生的零碎时间。
本轮Python语言程序设计课程组织了两次翻转课堂,分别是“使用random库生成复杂密码”和“如何快速计算大数是否为素数”。大多数同学参与积极性很高,课前通过MOOC和SPOC课程自学,辅以团队合作、网络检索和实践,提出了多种不同的实现方式,并在课堂上按组进行展示。例如在判断一段大数中都有哪些是素数问题上,从基本的算法设计,到尝试使用第三方NumPy库加速运算,既锻炼了学生基于计算思维解决问题的能力,也激发学生提出一些创新性的方法。从课后反馈来看,92.2%的学生认可或非常认可翻转课堂教学模式,93.3%的学生认为翻转课堂教学模式能够让自己更好地参与到课程中来。
3.3 班级博客
本学期,我校Python语言程序设计课程受邀参与国内某知名技术博客的测试功能。本课程任课教师在该博客网站开设班级博客,学生受邀加入该班级博客。学生在博客中发布的博文,该博文也会显示在本班级博客列表中,便于任课教师浏览评价。此外,班级博客还具有作业功能。班级博客并不限定学生只书写与课程相关的博文,还鼓励学生把一些感兴趣的和尝试的学习内容,写成博客发布在班级博客中。其中涌现出了大量的优秀学生博客博文,包括从简单地使用turtle库绘制一个心形图案的博文,到使用Python的NumPy、Matplotlib、cv2等库做图像的傅立叶全息变换的博文,有的同学在课程进行到第4周时就完成了教材中所有课后习题,并将参考答案发布到博客中。
采用班級博客这种新型教学方式,一方面可以锻炼学生的文字表达能力和逻辑思维能力;另一方面,学生坚持不懈地写技术博客,在毕业找工作时这将是自己成长的一个重要资料和见证;此外,班级博客内容全公开,会有很多关心中国计算机教育的业界程序员关注并点评学生博客内容,学生可以得到快速成长,并能够及早接触和理解计算机业界需求和解决问题的方式,一举多得。一个学期下来,本班级同学累计发表博文约230篇,很多同学成长迅速。
3.4 创新实验
为了能够更好地培养学生的计算思维能力和创新能力,提升学生解决实际问题的能力,课程从第7周开始主要围绕着各类库的应用展开,设计一些较综合的实验,助力培养学生的计算思维能力以及创新能力。
课程最后的综合性创新实验是“基于Python、Arduino、MAX30100的心率血氧数据采集分析系统”。其基本原理是使用开源硬件Arduino UNO R3,通过心率血氧传感器MAX30100接触人的手指获取心率和血氧数据,然后通过串口将数据传送给上位机的Python程序,由Python分析Arduino传输来的数据,并根据数据绘制心率血氧图,基本原理如图1所示。
本实验涉及Python语言的PySerial、turtle、Matplotlib等库的使用,以及开源硬件Arduino的编程和使用。为了在期末能够让多数同学顺利地完成此实验,课程将实验所需知识点合理切割,分布在前面各周的教学活动中,见表2。
表2 综合实验分布教学内容安排和目的教学周 部分授课内容 教学目的
第1、7周 turtle库的使用 使用turtle库绘制心率和血氧曲线
第6、8周 文件读写,读数据文件并绘图 能够读取提供的心率数据文件并使用turtle绘图
第9周 网络爬虫 爬取网络数据,为控制Arduino作准备
第11周 Arduino使用 Arduino编程和烧录程序,控制LED灯亮灭
第12周 PySerial库、Arduino 通过爬取网上数据实时控制LED灯闪烁速度
第15、16周 心率血氧综合实验 能够综合应用所学知识完成创新性实验
由表2可以看出,为完成期末创新性综合性软硬件结合的实验,需要大量的基础知识作为铺垫,这个循序渐进的教学过程对于培养学生的计算思维能力和解决实际问题能力具有重要的现实意义,同时也一定程度地培养了学生的创新能力。在这个综合性实验中我们做了一些尝试,效果很好:Arduino编程使用的是类C++语言,我们尝试在学生仅拥有Python语言基本语法的基础上,提供一些Arduino示例代码,由学生自行阅读理解并修改为自己需要的Arduino程序代码,大多数参与的同学都很好地完成了任务。本实验的实际参与人数为67人,占课程总人数的74.4%。endprint
3.5 学生助教
为了更好地开展教学活动,激发学生对于课程的参与度,我们从班级中选取了两位热心、同时具有较强学习能力和编程能力的学生担任了义务学生助教,取得了良好的教学和示范效果。两位同学从课程的组织,到实验课堂的辅导,以及班级微信群中的问题回答,起到了积极的作用,分担了任课教师的压力,同时也拉近了学生和学生、学生和教师之间的距离。学生助教的身份,增强了学生的荣誉感,两位同学在本课程中学习非常努力,并且带动了身边的同学更好地参与到课程中来。
3.6 其他尝试
兴趣是学习的最好催化剂,课程开始阶段就对学生做了一系列调查问卷,在问题“你选择这门课程最主要的原因中”, 90人提供了有效答案,其中选择“感兴趣”的为84人,选择“取得学分”的人数为6人。由此可见,学生选择这门课程的主要原因在于兴趣。为了能够让学生在学习过程中持续地保留兴趣,我们做了以下尝试。
(1)细节入手。课程讲授中,格外注重细节。例如,讲解摄氏温度和华氏温度转换时,首先提问大多数学生都了解的攝氏温度的概念,然后介绍大多数同学不知道的华氏温度的起源故事,将一个小程序融入到一个故事中,这样学生就不会觉得练习选择结构以及字符串处理这样的编程例题枯燥乏味。
(2)贴近所需。课程中对于Python库以及例题的选取,尽可能贴近学生所需。例如,讲解分词和文本词频的分析对于学生考研英语的现实意义时,让学生收集历年考研阅读理解真题,通过词频分析,可以得出考研阅读理解题目最应该掌握的单词有哪些,而不是每次都从英文词典的字母A背起;网络爬虫课程内容则有助于学生从网上自动爬取历年考试试题,或者其他自己感兴趣的新闻、资料;综合心率血氧实验,可以让学生了解当前物联网的运行原理并能参与进来。
4 结 语
经过一个学期的教与学,Python语言程序设计课程总体效果良好。最终的课程满意率为95.6%,绝大部分学生认为该课程对于自己所学专业或个人学习生活有帮助或有很大帮助。从本课程班级中产生了两组跨专业团队申报了学校创新创业实践项目,其中一组通过了学校评审,获得了学校资助。
本课程在教授过程中,尝试了多种新的教学模式,包括快速讲授最小化基础Python语言语法、MOOC+SPOC+翻转课堂、班级博客、创新实验、学生助教等内容,在培养学生计算思维能力、激发学生创新能力方面取得了显著效果。Python语言“小而全”,对于各种类库“按需引入”,是一种合适的编程课程语言,特别是针对低年级及非计算机专业学生,能够使得学生把更多的精力放在解决问题上,而不是消耗在学习语言和编程环境上。对于以后开展的Python语言程序设计课程,还将引入“结对编程”的概念,进一步将学生吸引到课程的学习中来,注重学生分析问题解决问题的能力,培养学生团队荣誉感。
当然,培养计算思维能力和创新能力,不是一门编程语言课程能够解决的。经过一学期课程的实践和探索,Python语言程序设计课程确实能够很好地助力计算思维和创新能力的培养。endprint