韩志豪
摘 要: 近几年随着人工智能的飞速发展,中国、美国已经将人工智能写入战略层面,但高校的程序设计课程与人工智能的发展存在着脱节的现象。本文分析了人工智能特点与发展方向,梳理Python编程语言特点与人工智能的关系,整理针对人工智能的Python程序设计教学内容,结合Python程序设计教学经验,提出人工智能方向的Python程序设计教学目标、教学模式、教学方法。通过教学实验,论证了本Python程序设计的教学方式优于一般的Python程序设计教学方式。
关键词: Python; 人工智能; 教学方式; 程序设计
中图分类号:G434 文献标志码:A 文章编号:1006-8228(2018)07-76-06
Abstract: In recent years, with the rapid development of artificial intelligence, China and the United States have written artificial intelligence into strategic layers. However, there is a disconnect between the programming courses in universities and the development of artificial intelligence. To solve this problem, this paper analyzes the characteristics and development direction of artificial intelligence, combs the relationship between the characteristics of Python programming language and artificial intelligence, organizes the teaching content of Python programming for artificial intelligence, and combining with Python programming teaching experience, proposes the artificial intelligence oriented Python Programming teaching objectives, teaching models and teaching methods. Through the teaching experiments, it is demonstrated that the Python programming teaching method is superior to the general Python programming teaching method.
Key words: Python; artificial intelligence; teaching method; programming
0 引言
2017年7月國务院发布《新一代人工智能发展规划》[1],12月国家工业和信息化部发布《促进新一代人工智能产业发展三年行动计划(2018-2020年)》[2]。2018年3月起,在计算机二级考试加入了“Python语言程序设计”。Python语言因其特有的属性:简洁高效、解释性、可扩展性、生态性[3],而成为了最受欢迎的语言,它丰富的第三方库,既避免了重复开发,又增加了语言的张力。目前,98%的人工智能的开发,用的是Python语言编程。
在高校传统的教学中,用C/C++或Java作为主要语言设计编程课程[3]。但是高校教学需要紧跟时代的步伐,更要走在时代的前列,与此同时,由于大数据分析、人工智能的蓬勃发展,Python语言市场对人才的需求,也正处于供不应求的状态。因此将Python程序设计作为必修课程显得尤为重要。
Python语言是一种解释型高级语言,可移植、跨平台、面向对象等特点,运用场景也越来越广泛[3]。与此同时,人工智能提升到了国家战略层面,推动着人类第四次工业革命。国内高校对Python与人工智能的教学研究还相对较少,人工智能主要集中在科研领域。在此环境下总结Python教学经验,探索人工智能方向的Python程序设计教育教学。
1 背景
1.1 人工智能的发展与教育
人工智能最早于1965年在Dartmouth学会上被提出,随后被定义为“人工智能就是研究如何使计算机去做过去只有人才能做的智能的工作”[4],人工智能最开始被盲目追捧,到20世纪七八十年代遭遇发展瓶颈,但在2016年谷歌基于深度学习的AlphaGo战胜了围棋世界冠军,又一次激发了人们对人工智能的热情[5]。
人工智能(英语:Artificial Intelligence,AI)的核心是能够构建与人类交流、学习,甚至超越人类推理、知识、规划、学习、交流、感知、移动和操纵物体的能力[6]。
目前,我国常用的人工智能方向,主要有无人驾驶、机器学习、智能搜索、智能推荐、图像识别、语音翻译、机器人、博弈、预测等。国内科技巨头华为、百度、阿里巴巴、腾讯、科大讯飞等公司,加快布局了人工智能的研究,他们成立了专门的研究机构,开放他们的定制平台,如百度的apollo系统,用于无人驾驶。阿里巴巴的阿里云ET城市大脑,用于交通管理;科大讯飞的语音云,用于语音识别与实时翻译。而国内高校对人工智能的研发与教学布局还相对较弱。
1.2 Python编程语言的背景与特点
21世纪,计算机经历了飞速的发展。计算机的编程语言也蓬勃发展,出现了汇编语言、C++、Java、C#、PHP、Python、Objective-C等等,但是像Python语言既具有面向对象的特点,又像脚本语言方便上手,却很少有[7]。因此,在2016年,教育部高等学校大学计算机课程教学指导委员会发布了《大学计算机基础课程教学基本要求》(简称:《基本要求》)[8],《基本要求》首次建议将Python语言作为首门程序设计课程的教学语言。
相比其他的传统语言,Python语言有如下的特点。
⑴ 简洁、易学。Python的语法逻辑清晰,简化变量类型的区分,并且增加多维度运算、多类型运算等,简化了编程的语义表达,提高了程序的可读性,增强了程序的逻辑结构。
⑵ 可嵌入性、可扩展性。Python语言可以嵌入到C++语言中,从而提供脚本编程的功能。Python程序中,也可以加入C++语言,来提高运行的效率。
⑶ 开放、开源。Python语言遵从GPL(GNU General Public License)协议,所有的代码都可以开放出来,这也使得Python拥有12万个以上的第三方库,避免了重复编程,提升了编程效率。
⑷ 高层语言、面向对象。Python是一种高层语言,当用Python编程时,无需考虑内存细节、指针问题等。而Python的语法既支持面向对象也支持面向过程。
⑸ 跨平台、可移植性。Python是一种解释型语言。这使得Python的程序可以直接在各种系统(如Linux、Windows、MacOS)拷贝运行,不必担心环境配置问题。
2 Python程序设计教学探索
为了适应没有编程基础的学生能学深Python语言编程,同时紧跟人工智能的时代背景,Python程序设计课程内容主要包括:Python简介,Python安装,Python输入输出,数据类型与变量,运算符,条件语句,循环语句,Python特性,函数,面向对象,常见类库,人工智能编程。
2.1 Python程序设计教学目标
教学目标是使学生进步和变化的明确表述,也是教学活动期望得到的学生的学习结果。因此,Python程序设计的教学目标在整个教学活动中,起着引导性的作用。
教学目标一 学生具有用Python编写基本程序的能力。要求学生根据程序的功能需求,建立面向对象框架,基于常用类库,使用Python语言编程并调试,最终实现程序功能。
教学目标二 学生掌握Python编程的特性。每一种编程语言都大同小异,但每一种编程语言都有它独有的特性。而Python语言是解释型语言,非常容易进行混合语言编程,方便使用它的第三方库。因此在运用Python时,必须避免与其他语言混淆,而学生掌握Python语言的特性显得尤为重要。其中Python较为著名的特性有:①字典;②切片;③生成式;④生成器;⑤逗号的用法;⑥简单循环;⑦浅拷贝与深拷贝;⑧类属性与实例属性;⑨装饰器,⑩正则表达式。
⑴ 字典的示例代码
name_scores={‘Jack:80, ‘Kevin:95, ‘Pony:75}
print(name _scores[‘Kevin])
输出:95
⑵ 切片的示例代码
sale=[155,102,74,11,55,87,63,42,99,82]
print(sale[0:3])
输出:[155,102,74]
print(sale[-3:-1])
输出:[42,99]
注:负号为反方向开始计数
print( sale[:4] )
输出:[155,102,74,11]
注:默认为从零开始计数
print( sale[::-1] )
输出:[82, 99, 42, 63, 87, 55, 11, 74, 102, 155]
⑶ 生成式的示例代码
temp=[x*2 for x in range(1, 11)]
print(temp)
输出:[2,4,6,8,10,12,14,16,18,20]
⑷ 生成器的示例代码
temp2=(x*2 for x in range(1, 11))
print(next(temp2))
输出:2
print(next(temp2))
输出:4
注:注意括号的区别
⑸ 逗号的示例代码
a,b=2,5
print(a,b)
输出:2 5
list_1=[1,2]
list_2=[‘a,b]
for x,y in zip(list_1,list_2)
print x,y
输出: 1 a
2 b
⑹ 简单循环的示例代码
print(“Tom”*2+”Jack”*3)
輸出:TomTomJackJackJack
⑺ 浅拷贝与深拷贝的示例代码
import copy
a=[1,2,3]
b=a
c=copy.copy(a)
d=copy.deepcopy(a)
print(id(a),id(b),id(c),id(d))
a.append(4)
print(a,b,c,d)
a=[4,5,6]
print(a,b,c,d)
输出:
19063880 19063880 19089800 19048840
[1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3] [1, 2, 3]
[4, 5, 6] [1, 2, 3, 4] [1, 2, 3] [1, 2, 3]
⑻ 类属性与实例属性的示例代码
class Tool(object):
num=0
def__init__(self,newname):
self.name=newname
注:其中num为类属性,name为示例属性
⑼ 装饰器的示例代码
def dec(func):
def innt():
print("zhuangshi")
return func()
return innt()
@dec
def func():
print("func")
func()
输出:
zhuangshi
func
注:python装饰器本质上就是一个函数,它可以让其他函数在不需要代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)
⑽ 正则表达式的示例代码
import re
data="Boys are taller than girls"
result=re.match( r'(.*) are (.*?) .*', data)
if result:
print ("result.group():", result.group())
print ("result.group(1):", result.group(1))
print ("result.group(2):", result.group(2))
输出:
result.group():Boys are taller than girls
result.group(1):Boys
result.group(2):taller
注:将data中与'(.*) are (.*?) .*'相匹配的内容赋值给result
教学目标三 使学生了解常用的Python库,了解人工智能思想及编程方式。在人工智能时代背景下,若不借第三方库,只靠Python的标准库,很难编写复杂的处理程序。而Python有开源的特性,其所衍生的第三方Python库也均都开源,而且很多开源库都有团队维护,因此十分适合企业及个人使用。常见的Python标准库如pdb、urllib、httplib、hash、os、threading等,常见的Python第三方库requests、numpy、matplotlib、tensorflow等,其中打败全世界围棋高手的AlphaGo,就是基于tensorflow开发而来的。由于第三方库众多,函数及用法各有不同,让学生全部掌握十分困难,需要指导学生了解第三方库的特征及用法。当学生需要用时,采用“help()”指令的方式得到该函数的用法及参数特性,使学生学会去独立探索Python库的多样性,而不是一味的填鸭式教育,这样可以提升学生学习的积极性与主动性,提高学生的动手能力,增强学生的探索与创新精神。
2.2 任务驱动与项目驱动混合教学模式
为了达到上述的教学目标,Python程序设计在教学活动中采用学生主体、教师主导的任务驱动与项目驱动混合模式,开展教学活动,引导学生完成每一章节的具体任务,从而提升学生的Python语言编程能力。
任务驱动模式是指在教学过程中,以学生为中心,以任务为载体,把教学内容巧妙地隐含在一个个具体任务之中,学生通过独立或协作完成任务,学习新知识和新技能 [9]。Python程序设计在教学过程中,对于基础章节每一小节一个任务,以任务结果评价学生掌握情况,通过这样的方法打破理论与实践分离,将课堂理论运用到任务中去,实现理论与实践相统一。
Python程序设计的示例任务如下。
任务1 两个文件file1和file2,各存放一行字母,要求把这两个文件中的信息合并,并且按字母顺序排列,输出到一个新文件file3中。
任务1代码如下:
import string
fp1=open('file1.txt')
data1=fp1.read()
fp1.close()
fp2=open('file2.txt')
data2=fp2.read()
fp2.close()
fp3=open('file3.txt','w')
data_all=list(data1+data2)
data_all.sort()
data_unite=''
data_unite=data_unite.join(data_all)
fp3.write(data_unite)
fp3.close()
項目教学法是师生通过共同实施一个完整的项目工作而进行的教学活动。将一个相对独立的项目(产品教学法),交由学生自己处理。信息的收集、方案的设计、项目的实施及最终的评价,,都由学生自己负责 [10]。在Python程序设计的项目教学中,考验了学生对Python基本库与第三方库的了解及运用程度,结合人工智能的编程思路,带领学生了解人工智能在日常生活中的运用。有些大型项目,学生无法直接入手,在课程教学活动中需帮助学生了解大型项目的开发流程,模块分割,联合调试等,使得学生在学会协作编程的同时,提高企业项目的编程能力。
任务2 Python程序设计的示例项目:有如下一组数据,X代表房子面积,Y代表房子价格,运用面向对象设计思想,采用线性回归拟合,将最后回归信息通过坐标轴展示。
X=[18,20,33,45,94,110,121,133]
Y=[1324,3315,2218,4127,8679,9989,10987,15412]
任务2的关键代码如下:
import numpy as np
import matplotlib.pyplot as plt
house_area=np.array([18,20,33,45,94,110,121,133],
dtype=np.float64)
house_price=np.array([1324,3315,2218,4127,8679,9989,
10987,15412],dtype=np.float64)
class House_Price_Predicted(object):
def__init__(self,datenum,iternum,learnrate):
#super(House_Price_Predicted,self).__init__()
self.date_num=datenum
self.iteration_num=iternum
self.learn_rate=learnrate
def simple_d_a(self,cal_price,price,area):
return (cal_price-price)*area
def simple_d_b(self,cal_price,price):
return cal_price-price
def cal_loss(self,cal_price,price):
return sum((cal_price-price)**2)/(2*self.date_num)
def draw_date(self):
chart1a=np.array(np.linspace(-20,20,100))
chart1b=np.array(np.linspace(-20,20,100))
draw_loss=np.zeros(shape=(len(chart1a),len(chart1b)))
for ai in range(0,len(chart1a)):
for bi in range(0,len(chart1b)):
a0=chart1a[ai]
b0=chart1b[bi]
temp=self.cal_loss(a0*house_area+b0,house_price)
draw_loss[ai][bi]=temp
chart1a,chart1b=np.meshgrid(chart1a,chart1b)
return(chart1a,chart1b,draw_loss)
def draw_chart(self):
fig=plt.figure(1,figsize=(12,8))
chart1=fig.add_subplot(1,1,1)
chart1.plot(house_area,house_price)
chart1.plot(house_area,house_price,'o')
chart1.set_xlabel('X')
chart1.set_ylabel('Y')
for step in range(1,self.iteration_num):
__loss=0
all_da=0
all_db=0
for i in range(0,len(house_price)):
tempda=self.simple_d_a(a*house_area[i]+
b,house_price[i],house_area[i])
tempdb=self.simple_d_b(a*house_area[i]+
b,house_price[i])
all_da=all_da+tempda
all_db=all_db+tempdb
__loss=(a*house_area[i]+b-house_price[i])**2/2.0
tempx=np.linspace(0,1,4)
tempy=tempx*a+b
chart1.plot(tempx,tempy)
a=a-all_da * self.learn_rate
b=b-all_db * self.learn_rate
all_loss.append(__loss)
all_step.append(step)
plt.ioff()
plt.show()
def main():
hp=House_Price_Predicted(8,100,0.01)
hp.draw_chart()
if __name__ == '__main__':
main()
注:為了方便运算,代码通过标准化将数据调整到0~1之间。
通过上述代码当迭代次数为20次时,线性拟合为图1所示。
当迭代次数设为100时,线性拟合如图2所示。
当迭代次数设为500时,线性拟合如图3所示。
Python程序设计的任务驱动与项目驱动混合教学模式,在整个教学过程中,基础知识部分适合以任务驱动教学模式,而在拓展知识部分及综合训练适合以项目驱动教学模式,其中拓展知识部分主要包括面向对象,常见类库,人工智能编程。
任务驱动与项目驱动混合教学模式,克服了理论知识枯燥乏味,学生积极性、主动性不高,实操能力不强等问题,同时与单一的任务驱动相比,增加了学生真实的项目经验,实现了产教融合,与单一项目驱动相比,减轻了学生学习Python编程与人工智能编程的压力,给予学生更多的编程信心与编程乐趣。
2.3 Python程序设计“1171”教学方法
教师为实现教学目标而开展各种教学活动设计教学程序,采用必要的教学手段。
在Python程序设计课程中,把每次课程分为4个阶段,分别占用课时比例为10%,10%,70%,10%,故简称为“1171”教学法。前10%主要采用讲授法或启发式教学法,带学生引入课程,并理解知识点;接下来10%为课程的演示阶段,主要通过演示法或讨论法,向学生演示编程实现某个功能的过程,或向学生提出综合性的项目问题,与学生展开讨论;占比最大的70%时间,用于学生的编程实操、实验,在学生需要帮助时给予启发,提高学生自主探索的能力;最后的10%时间,采用讲授法或讨论法,向学生阐述整个课程中遇到的常见问题及编程技巧,总结本堂课的重点内容。
根据实践,在整个Python程序设计的教学活动中,采用“1171”的教学法,能大大提升学生的自主性与创新创造力,而采用传统的讲授法与实验法结合教学,难以激发学生的兴趣,通过在课程中间穿插学生对于项目、任务的讨论,加深学生对于知识点的理解,并为编程实训做好铺垫,同时让学生懂得了团队合作。而最后的总结时间,是引导学生对于实操中问题的回顾,加深了学生对重点和难点的印象。
3 结束语
在浙江国际海运职业技术学院的程序设计课程中进行了教学实践。实践表明,该教学目标、教学模式、教学方法可以激发学生对Python程序设计的学习热情,并且了解人工智能的编程思路,同时使学生具有运用Python解决实际问题的能力。逐渐的Python代替C语言成为其他非计算机专业的程序设计必修课,学生可以告别复杂语法的困扰,而专注于其专业领域的研究。但目前国内高校的Python师资短缺,希望本文能为程序设计相关的教辅人员提供教学思路,以期更好的推广Python教学。
参考文献(References):
[1] 新一代人工智能发展规划[Z].国发〔2017〕35号.
[2] 《促進新一代人工智能产业发展三年行动计划(2018-2020年)》印发[J].机器人产业,2018.1:70-79
[3] 秦科,刘贵松.面向Python应用的大学教学改革初探[J].计算机教育,2017.9:21-25
[4] 派崔克·温斯顿.人工智能[M].剑桥出版社,1984.
[5] 马玉慧,柏茂林,周政.智慧教育时代我国人工智能教育应用的发展路径探究——美国《规划未来,迎接人工智能时代》报告解读及启示[J].电化教育研究,2017.38(3):123-128
[6] De Meyer, Kris. Foundations of stochastic diffusion search.Diss. University of Reading,2004.
[7] 秦科,刘贵松.面向Python应用的大学教学改革初探[J].计算机教育,2017.9:21-25
[8] 嵩天,黄天羽,礼欣.Python语言:程序设计课程教学改革的理想选择[J].中国大学教学,2016.2:42-47
[9] 吴静.项目教学法与任务驱动教学法的异同比较[J].北京工业职业技术学院学报,2011.10(3):79-82
[10] 徐肇杰.任务驱动教学法与项目教学法之比较[J].教育与职业,2008.11:36-37