项目驱动的Python课程教学研究
杜兰 陈琳琳 刘红英 季晓君
摘 要:针对目前Python语言程序设计教学中学生兴趣不高、参与度不足的问题,基于Python语言程序设计教学实际,引入项目驱动教学法,提出以抽签系统作为一个连贯的实验项目驱动教学改革思路,以点成线、以线铺面、激发兴趣、培养实践、引导创新。实践证明,这种教学方式能激发学生学习热情,提高主观能动性,提升应用能力,培养团队协作能力,对程序设计课程改革有一定指导意义。
关键词:Python语言;项目驱动;综合应用能力
DOI:10. 11907/rjdk. 201738??????????????????????????????????????????????????????????????????????????????????????????????????????? 开放科学(资源服务)标识码(OSID):
中图分类号:G434 ?? 文献标识码:A?????????????????????????????? 文章编号:1672-7800(2020)011-0268-04
Research on Project-driven Python Course
DU Lan, CHEN Lin-lin, LIU Hong-ying, JI Xiao-jun
(School of Computer, Nanjing University of Science and Technology Zijin College, Nanjing 210023,China)
Abstract: Aiming at the problems of students low interest and insufficient participation in the course teaching of Python language programming, based on the teaching practice of Python language programming this paper introduces, the project driven teaching method, and prepeses the reform idea of taking the lottery system as a coherent example experiment project. The idea is to form a line with points, pave the way with lines, stimulate interest, cultivate practice and guide innovation. This kind of curriculum reform can stimulate students enthusiasm for learning and improve their application ability.
Key Words: Python; project driven; comprehensive application ability
0 引言
隨着人工智能、大数据、物联网、移动计算的迅速发展,社会各界对软件技术的需求不断加深,高校纷纷开设Python语言课程, Python教学改革研究成为热点[1-8]。嵩天等[1-2]以开展非计算机专业本科生Python语言教学为契机,建立完整的教学体系,积累丰富的线上线下教学资源;董付国等[3-4]针对软件工程专业制定课程体系结构,建设大量的课外资源;车万翔等[5]开展计算机专业高级语言程序设计课程改革;张莉等[6-7]基于MOOC翻转课堂建设“用Python玩转数据”课程,探讨如何在同一课堂克服不同专业差异,提升学生问题求解能力;赵广辉等[8]以赋能为目标对非计算机专业程序设计公共课进行重构,按照“二性一度”的金课标准建设课程。
上述研究虽然提升了教学效果,但主要侧重于教学内容、教学设计及课程资源建设等方面,对实验环节鲜有研究。笔者学校办学定位是应用型本科院校,一直致力于寻求适合自身办学特点的教学模式。应用型本科教学强调“应用”二字,对于实践性较强的程序设计语言课程,实验教学显得尤其重要。实验教学设计质量决定学生的实践能力。一个好的实验设计,一方面能很好地帮助学生理解理论知识点,另一方面能培养学生的动手能力。博雷泊在1979年首次将项目驱动教学法应用于语言教学实践,之后国内教师纷纷在教学实践中引用该方法,虽然实施方案各有不同,但总体都是以学生为中心、以教师为引导、以项目为载体、以小组协作为基础,在“做中学”,培养学生应用能力。因此,本文对Python语言程序设计教学进行改革,提出基于项目驱动的教学模式,围绕学生喜闻乐见的抽签程序,精心设计模拟项目展开Python程序设计课程教学改革,激发学生学习兴趣,提高学生应用能力。
1 教学现状分析
Python语言程序设计课程要求学生掌握如下知识:①Python语言程序设计基本理论与方法;②Python组合数据类型与操作;③Python文件操作;④运用第三方库解决实际问题。Python课程实践性强,要求学生掌握的知识点多而杂,学生能融会贯通所学知识并不容易。笔者分析教学效果后发现, Python课程“教师讲授,学生模仿”的教学方式不能满足需求,应围绕教学对象、教学方式、教学内容和教学评价4个中心展开教学。
(1)教学对象。教学对象是自动化专业大三学生,学生在此之前已经先修过C语言,掌握基本数据类型、流程控制结构、函数和文件操作等概念,如果还按传统的教学方式开展教学,学生很容易陷入到语法中去,不能体会到“Python轻语法,重应用”的特点,容易产生疲倦心理,提不起兴趣。
(2)教学方式。通过分析文献[1-8],并对周边高校走访调研发现,现有教学方式以“教本位”的“教师讲授,学生模仿”开展,学生依赖教师“依葫芦画瓢”,只能完成简单的小程序,对于较复杂的实际应用问题束手无策,不能提出有效的解决方案。
(3)教学内容。现有Python语言程序设计以教材章节为主线,以“流水线”式简单罗列知识点,上机实验以验证经典算法为主,实验内容不连贯且远离学生实际生活,趣味性低,学习效率低,难以将程序设计知识学习升华到程序设计能力。
(4)教学评价。传统方式下的课程考核以考试卷面成绩作为主要评价依据。因为试卷篇幅和时长有限,编程题能写的代码行数有限,因此不是综合性项目,往往只是一些经典算法题。许多学生为了应考提前背诵一些编程题目,虽然死记硬背下来了,但是不能将这些经典算法灵活应用到实际场景。这种不完善的考核机制不仅不能准确评价学生,而且造成“要想成绩好,多背算法题”的错误认识,不利于培养学生编程解决复杂应用问题的能力。
2 项目驱动教学模式
项目驱动教学是在建构主义理论基础上发展起来的教学模式,其核心理念是教师精心设计一个完整项目,把该课程的基本知识点与实验项目融合,在项目操作中开展教学活动,学生根据项目需求有目的地习得知识,并将所习得的知识应用于实践。具体实施方案是:首先引导学生自由形成团队,引入产业界的项目管理办法,引导全班同学一起讨论项目的需求分析、概要设计、详细设计与测试验收,让学生充分了解项目进度要求;然后师生一起将大项目细化分解为一系列小项目,从最小的项目开始实施。在教学过程中教师将项目要求掌握的知识点从简单到复杂展开讲解,鼓励学生在课堂上思考讨论。在实验课上学生以项目为驱动带着问题做实验,团队成员共同完成任务,学生之间相互学习,充分发挥主观能动性;最后将一个个单一项目向上组合形成最终的综合性项目。
项目驱动教学模式是将知识点贯穿到整个项目运作过程中,学生要求掌握的知识点和技能内容如下:
(1)专业基础知识。掌握Python基础,包括基本数据类型、组合数据类型、控制结构和文件操作;掌握Python进阶,能够应用第三方库解决较复杂问题。
(2)专业能力与职业素质。培养计算思维,培养代码调试能力,形成基本编程规范意识,培养工程实践能力。
(3)主动学习能力与科研精神。培养学生主动学习能力,树立科研求索精神。
(4)团队协作能力。强调以团队为单位,考核按照团队分工和整体表现来评价,要求学生重视合作,共同进步。形成团队以后,学生按项目管理规范分工合作,严格按项目开发进度进行工作,各个过程都要输出该阶段要求的文档。
3 项目设计与实施
3.1 项目设计
项目选取要满足如下条件:①与课程知识点息息相关;②难度适中、容易实现、贴近生活的小型应用项目。为此笔者采用学生熟悉的抽签程序作为教学案例,激发学生兴趣;按教学章节边讲边练,学生分组合作完成项目,从简单程序逐步完成复杂程序。学生自己设计开发出来的抽签程序应用在课堂随机点名和随机提问等场景,不仅让课堂更加有趣,而且学生有成就感。教学项目如表1所示。
Python语言程序设计课程中,以“基于人脸识别的抽签程序”为模拟项目按知识点从简单到复杂实施:①使用基本数据类型和random数据库随机抽取一个数字;②在学习了列表、集合和字典等复杂数据类型后,使用字典存储学生学号姓名,然后使用随机函数抽取学生学号和姓名;③在学习了文件操作相关知识后,从教务处的花名册直接进行抽签;④在学习了图像处理后按学生照片抽签;⑤使用人脸识别技术进行实时动态的人脸抽签。
完成这一阶段功能以后,要求学生基线化,也就是要求学生将代码和文档全部提交到服务器上,将较优秀的作品在课堂上应用。学生作为用户进行现场测试,提出改进点,进一步完善作品。此外,在课堂上可以寻求帮助,以 “我们团队做过了XX工作” “我们计划做XX”和“我们需要XX帮助”来展开讨论,大家积极提供帮助,同时思考自己是否也存在类似问题,要怎么解决。
3.2 项目改革实践
3.2.1 項目立项,团队分工合作制定项目计划
Python语言程序设计课程共48个学时,其中理论课24学时,实验课24学时。每周理论课2学时,实验课2学时。在第一次上课的课间休息时间分好小组,按小组重新就坐,全班一起编写进度计划表,合理安排各阶段任务,如表2所示。
3.2.2 项目实施,团队群策群力完成开发任务
项目1:使用random库按序号抽签。
理论课目标:(1)数字(int整数、float浮点数、bool布尔值、complex复数)的运算及操作;(2)string字符串的基本操作(索引、切片等);(3)random库(随机库)的使用。
实验课目标:使用random库编写最简单的抽签程序。先把学生按学号排序,然后随机抽取一个序号,核心代码如下:
student_num = 80? #班级总人数80人
lucky = random.randint(1,student_num)
print(lucky)
项目2:使用random库按学号姓名抽签。
理论课目标:组合数据类型(列表(list)、元组(tuple)、集合(set)、字典(dict))及各种基本操作(增删查改等)。
实验课目标:按学号姓名抽签。先把学号姓名存储在字典中,考虑到有重名的可能性,随机抽取唯一的学号,然后显示被抽中者的学号、姓名。核心程序代码如下:
student? = {“170310106”:“李和”,“170310138”:“冉虹”,“170310143”:“李德伟”,“170310144”:“李佳”}
lt = list(student.keys())
lucky = random.choice(lt)
print(lucky,student[lucky])
项目3:使用签到表抽签。
理论课目标:文件的操作(文件打开关闭和文件读写)。
实验课目标:从学生签到表中抽取学生姓名学号。核心程序代码如下:
names = []
excel = xlrd.open_workbook(u“C:/Users/dl/Desktop/Python/2019/check_in.xlsx”)
sheet = excel.sheet_by_index(0)
nrows = sheet.nrows
for i in range(2, nrows):
no = sheet.cell(i, 1)。value
nos.append(no)
lucky = random.sample(nos, 1)
print(“\n抽中名單:”,lucky)
项目4:使用照片随机抽签???????? 。
理论课目标:PIL库的使用
实验课目标:为避免学生冒名顶替,从学生图片库中抽签,实现的重点是从n个文件夹中分别随机抽取m张图片,剪切到新的文件夹中,然后打开文件夹里的图片。核心程序代码如下:
def copyFile(fileDir, tarDir ,m):
pathDir = os.listdir(fileDir)
sample = random.sample(pathDir, m)
print(sample)
for name in sample:
shutil.move(fileDir + name, tarDir + name)
项目5:基于人脸识别技术进行抽签。
理论课目标:人脸识别常用算法及三方库的应用,重点介绍FaceNet库。
实验课目标:基于人脸识别进行抽签。充分利用教室和实验室摄像头,自动捕捉到课学生人脸,通过人脸识别实现无感点名。对到课的学生基于人脸进行提问、分组或实验题目抽签。在人工智能大环境下,结合本校应用型本科人才培养目标,本实验更侧重于实际应用领域,使用GitHub上现有成熟的算法,避免学生花费大量时间在人工智能算法细节。通过指导学生从https://github.com/davidsandberg/facenet.git下载的FaceNet [10](Google研发的人脸识别系统)开源工程代码设计与实现人脸抽签软件,包括从摄像头读取视频、检测人脸、识别人脸、人脸抽签等功能。①使用opencv2从摄像头读取视频帧,转换为灰度图像;②对读取视频帧使用MTCNN进行人脸检测并对齐与裁剪;③使用预训练FaceNet对MTCNN检测的人脸进行embedding(映射),得到128维度的特征向量;④对人脸embedding的特征向量使用欧式距离衡量两张人脸图片之间的相似度。
3.2.3 项目结项,团队共同复盘整理提交成果
在完成所有项目设计后,团队一起复盘,大家一起回顾当初制定的目标,分析亮点及其形成的原因并记录下来;分析不足及原因,讨论如何采取举措避免;整理提交所有代码及所有文档。
3.3 项目量化评价
课程考核采用多元评价体系,最终成绩由平时成绩、实验项目阶段考核成绩、大作业项目阶段考核成绩3部分组成。项目阶段考核以小组形式答辩,先对小组综合定级,综合小组成员自评和对小组成员提问表现,根据学生在系统设计中的贡献率和Python语言掌握情况给予客观的综合成绩。经过本课程实验教学,学生掌握较大项目的设计与实现方法。最后2次实验课以小组大作业方式进行,学生团队自主设计一个自己感兴趣的新系统。选题不作限制,鼓励学生充分发挥主观能动性,尽可能创新。基于人工智能的物体识别机器人设计与实现的团队大作业,使用电子小车作为移动载体,搭载配置了图像识别系统的树莓派,设计一个能够进行图像识别、自动寻物的机器人。同时,为了便于外部直接指挥机器人运行,在PC端设计服务器,通过路由器的局域网向机器人传入指令。基于人工智能的物体识别机器人由配置物体识别系统的树莓派、摄像头、超声波模块、Arduino板、配置编码器的电机驱动模块和局域网终端组成,实物如图1—图4所示。
4 教学效果
Python语言程序设计课程应用项目驱动教学,优化了学习内容,成功构建 “以学生为中心、以教师为引导、以项目为载体、以小组协作为基础”的良性教学秩序,培养学生应用Python语言程序解决实际问题的工程实践能力,锻炼学生的创新能力,帮助学生在各类竞赛和科研项目中取得一定的成绩:①积极参加全国性比赛,在中国机器人大赛和全国计算机设计大赛等比赛中获得国家级和省级多个奖项。竞赛获奖成绩证明学生具备了应用Python分析解决问题的能力和创新能力;②教师将科研项目引入课堂,以研促教,训练学生科研能力。学生积极申报江苏省大创项目和校大创项目,多个项目成功立项和结题,证明学生具备应用Python开展科研的能力。
教改后,学生普遍认为该课程有趣、有用,更加热爱程序设计,对人工智能、大数据等课程学习更有信心。
5 结语
项目驱动的Python程序设计教学改革,采用学生耳熟能详的可应用于现实场景的抽签项目,提升学生兴趣,最大限度发挥学生的主观能动性,促进对Python程序设计知识的融会贯通,夯实专业知识,培养综合应用能力,激发创新思维能力,满足社会对计算机人才的需求。从该课程教学结果来看,学生较全面地掌握该课程理论基础知识,具备一定的工程实践能力,在一定程度上锻炼了创新能力,符合学校教学定位,达成教学改革既定目标。但由于项目驱动教学模式以“学生为中心,教师引导”,更强调学生主体地位,学生主导教学内容、教学形式等,甚至高度參与考核成绩评定。因此,相对于传统课堂学生的自由空间更高,课程教学效果自然很大程度上受到学生自律能力和团队凝聚力影响。对于自律能力和凝聚力强的团队会朝着共同发展、共同进步的目标前进,而对于自由散漫、队员难以配合的团队就不尽如意。如何有效引导自律性和配合性较差的团队积极参与教学过程以取得更好的教学效果,是Python语言教学实践需要进一步研究的重点。
参考文献:
[1] 嵩天,礼欣,黄天羽. Python程序设计基础[M]. 第2版. 北京:高等教育出版社,2017.
[2] 嵩天,黄天羽,礼欣. Python语言:程序设计课程教学改革的理想选择[J]. 中国大学教学,2016,15(2):15-20.
[3] 董付国. Python程序设计开发宝典[M]. 北京:清华大学出版社,2017.
[4] 李博, 董付国, 冯烟利, 等.? 面向软件工程专业的Python课程建设[J].? 计算机教育, 2019,18(1):92-96.
[5] 车万翔,苏小红,袁永峰,等. 计算机专业高级语言程序设计课程改革探索[J]. 计算机教育,2014,25(13):56-58.
[6] 张莉,金莹,张洁. 基于MOOC的“Python玩转数据”翻转课堂实践与研究[J]. 工业和信息化教育,2017,32(3):70-76.
[7] 张莉,金莹,张洁,等. Python程序设计教程[M].? 北京:高等教育出版社,2018.
[8] 赵广辉, 李屾, 秦珀石.? 以赋能为目标的Python程序设计线下“金课”建设[J]. 计算机教育,2019,18(11):28-32.
[9] DAI J,HE K,SUN J.Instance-aware semantic segmentation via multi-task network cascades[C]. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition.2016:3150-3158.
[10] SCHROFF F,KALENICHENKO D,PHILBIN J.Facenet:a unified embedding for face recognition and clustering[C]. Proceedings of the IEEE conference on computer vision and pattern recognition.2015:815-823.
(责任编辑:杜能钢)