面向Python应用的大学教学改革初探

2017-09-28 21:10秦科刘贵松
计算机教育 2017年9期
关键词:实验教学教学改革

秦科++刘贵松

摘 要:数据分析与处理是计算机应用面临的一项重要任务。针对国内大学的程序设计教学与数据分析存在脱节这一现象,分析Python自身的特点和Python计算生态的发展现状,结合工程项目中的应用经验,提出面向数据分析的Python程序设计语言教学改革方法并以案例说明。

关键词:Python;教学改革;实验教学;计算生态

0 引 言

随着时代的发展,构建在互联网生态模式之上的云计算、大数据、人工智能等新技术,正渗透到每一个行业,引发产业生产、服务模式的变革,并且已经取得一系列重要成果。在此背景下,大学教学如何跟上时代步伐,是值得每一个高校教师深入思考的问题。程序设计作为计算机专业大学生的必修课程和必须掌握的基本技能,其教学改革在新时代下尤显必要。

传统的大学教学中,一直都以C/C++或Java作为教学语言。诚然,C/C++和Java是当今使用人数最多的语言,但在“互联网+”时代,面对大数据分析时,特别是面对数据采集、仿真建模、结果验证与数据可视化时,他们就不再是最佳选择。

Python作为一种解释型超高级语言,具备交互式、可移植、面向对象的特点。它功能强大,适用于多种操作系统,有完善丰富的工具包,正在得到越来越多的应用,而且越来越被重视。2017年4月,北京理工大学计算机学院和高等教育出版社联合承办了“第一届高等学校Python语言及计算生态教学研讨会”,提出了计算生态的概念[1],大力推动了Python教学。在此背景下,根据我们在Python教学和科研中的应用经验,对如何进行基于Python计算生态的教学改革进行探讨。

1 Python语言的兴起与优势

从20世纪中期到今天,短短的70年间,电子计算机经历了飞速的发展,出现了许多不同的程序设计语言,例如Pascal、Fortran、C、C++、Java、PHP、C#等,这些不同的语言,都体现了不同的设计哲学,也反映了不同的时代特点。

然而,每种程序设计语言都有其局限性。Python的设计者Guido von Rossum希望有一种语言,既具有C方便地调用计算机功能接口的能力,又可以像一些脚本语言一样轻松地编程。Python正是在这种背景下被创造出来。

同C/C++和Java等语言相比,Python有以下优势:

(1)简单易学。Python是一种代表简单主义思想的语言,语法简单,学习起来容易上手。这使学生能够专注于解决问题而不是学习语言本身。

(2)解释性。Python写的程序不需要编译成二进制代码,可以直接从源代码运行程序。这使得Python更加简单,更易于移植。

(3)面向对象。Python既支持面向过程的编程,也支持面向对象的编程。

(4)可扩展性。为了提升运行效率,可以采用C/C++来编写关键代码,然后在Python程序中使用它们。

(5)混合编程。Python被称为胶水语言,是由于可以很容易地将Python与其他语言进行混合编程。这样方便地利用已有的各种工具包,提高开发效率。

(6)丰富的库。Python有强大的标准库,并且Python的生态系统开始拓展到第三方包,例如用于Web框架的web.py ,用于科学计算的numpy,以及用于数据可视化的matplotlib等。

Python作为一种跨平台编程语言,已经被移植在以Linux、Windows、Mac、Android为代表的许多平台上。由于Python的开放性,有丰富的来自开源社区的成熟库支持,从而可以基于Python完成各种工作,例如数据采集(如网络爬虫)、图像处理、机器学习、科学计算等。

2 针对Python的应用支持与国内外课程建设情况

正由于Python具有上述优点,它获得了业界的广泛支持。例如在Google公司,Python是继C++和Java之后,使用率排名第三的编程语言,使用Python的开发团队也是Google的第三大研发部门。

(1)Tensorflow:TensorFlow是由Google Brain小组开发的用于机器学习和深度神经网络的工具。据统计,Tensorflow是目前使用人数最多的开源深度学习框架[2]。TensorFlow本身是使用C++实现的,然后用Python封装。Tensorflow可以根据用户给出的所有指令创建一个计算图,该图被内部优化和编译成可执行的C++代码。这样Tensorflow就可以利用Python 带来的开发速度和C++带来的执行速度。

(2)Google App Engine:Google App Engine(GAE),是谷歌推出的云平台,它完全把CPU、内存等硬件基础设施抽象化,这样只需要关注代码的编写,不需要关注硬件、操作系统或者物理位置。Python是GAE最早支持编程的语言之一,任何使用Python编写的程序,都可以配合Google Python API,很方便地在GAE上创建、部署、运行Python程序。

(3)Caffe(Convolutional Architecture for Fast Feature Embedding):Caffe是由Berkeley AI Research(BAIR)和Berkeley Vision and Learning Center (BVLC)社區贡献者开发的另一个深度学习框架。同Tensorflow一样,Caffe也是采用C++进行编写,然后提供Python封装,从而既可以利用C++的高执行效率,也可享受Python的高开发效率。

(4)在好莱坞,工业光魔公司(Industrial Light) 采用Python制作商业动画,在“阿贝斯(Abyss)”“星球之旅(Star Trek)”“Indiana Jones”等超级大片中惊艳登场。endprint

(5)ERP和CRM软件的开发也开始基于Python完成;Red Hat曾用Python和Tk一起成功开发配置和管理操作系统的可视界面,整个系统可以全面控制Linux操作系统,并根据用户选择对配置文件作自动更新。

正由于Python是受到业界的欢迎,国外很多高校(如麻省理工学院、斯坦福大学、加州大学洛杉矶分校等)已经用Python作为程序设计语言的教学对象。在Coursera等在线教育平台上,可以发现有来自密歇根大学、莱斯大学、约翰霍普金斯大学等众多高校的Python课程;国内南京大学张莉老师的课程也在其中。然而国内这方面的工作做得还远远不够。截至2015年,我国开设Python语言教学的高校不超过10所[3]。目前在国内大力推动Python教学改革的主要有北京理工大学嵩天老师等人,已编著并出版相应的大学教材[4],受到广泛欢迎。哈尔滨工业大学车万翔老师等人分析了C语言作为入门语言的不足和Python作为入门语言的优势,阐述了计算机专业高级语言程序设计课程的改革方案和实施效果[5]。南京大学张莉老师发表了《基于MOOC的“用Python玩转数据”翻转课堂实践与研究》,研究证明:采用Python教学可以较好地提高学生的主动学习能力、学习兴趣和热情以及问题求解能力[6]。

3 基于Python的教学科研应用改革案例

3.1 输入输出

输入输出(I/O)是每个程序都必须具备的重要功能。常见的I/O可以分为3类:标准I/O(终端打印等)、文件I/O和网络I/O。以終端I/O为例:

/* Basic I/O in C */

#include

int main()

{

char name[20]; /* char数组,保存第一行输入,作为名字输出 */

scanf("%s", name); /*读取第一行输入 */

printf("Hello %s\n", name);

return 0;

}

以上用C语言编写的有效代码共计8行,输入输出都采用标准库函数。由于C语言本身设计方面的缺陷(如果第一行输入超出char数组大小),可能导致严重的缓冲区溢出问题。针对这一问题,C++对数组越界进行了保护,从而提高系统安全性。

如果采用Java实现,则有效代码共10行。由于Java的面向对象编程思想,下面这个示例程序中多了很多对象构造的流程,引用的库看起来也相对较多,如下所示。我们只需要对这段代码进行稍微修改,就可以实现网络I/O和文件I/O。例如,替换“System.in”,就能够实现对文件或者网络流读取。将“Reader”和“InputStream”替换,就能够实现写入。

/ * Basic I/O in Java */

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class HelloWorld {

public static void main(String[] args) throws Exception { /*所有Java程序的入口函数 */

/* 新建输入对象,用来读取标准输入。其中对象构造有嵌套*/

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

String name = reader.readLine(); /* 读取第一行输入 */

System.out.printf("Hello %s\n", name);

}

}

相比之下,基于Python的代码则非常短小简洁:

/* Basic I/O in Python */

import sys

name = sys.stdin.readline() /* 读取第一行输入 */

print("Hello " + name)

有效代码仅仅只有3行!同样,替换其中的“sys.stdin”可以实现对文件读取。对于动态类型的Python来说,所有的变量都不需要繁复的声明,直接用就可以,再加上解释执行的特点,无需定义入口函数即可运行。

以上是对C/C++、Java、Python在基本终端I/O操作上的比较,当推广到文件I/O和网络I/O后,Python的优势会更突出,详见表1。

3.2 数据操作

数据处理是大数据时代我们面临的首要问题。然而,由于信息化系统建设过程中,数据可能以不同的结构存在,可能是纯文本文件、CSV格式,也可能是Excel格式,或者是各种不同厂商的数据库格式。

当然,可以采用C++或Java来读取各种异构数据源,但过程相当繁琐,需要利用各种底层驱动,甚至是一些商业化组件。以Excel文件读取为例,为了处理Excel数据,C/C++代码需要用到libxl商业库,而Java也需要用到Apache POI开源库。而利用Python对Excel文件进行读取则需要利用Pandas开源数据处理分析库,示例代码如下:

/* Read Excel in Python */

import pandas

df = pandas.read_excel('sample.xls')

print df.columns /* 输出列名 */

values = df['列名'].values /* 获取某一列的所有数据 */

FORMAT = ['列名1', '列名2', '列名3'] /* 获取指定列组成的数据帧 */

df_selected = df[FORMAT]

总的来说,在数据库操作方面,C++、Java和Python的支持都非常好。C++和Java都为SQL提供了标准的连接、驱动管理类,不同的数据库只需要加载不同的驱动就可以。Java对数据库有比较好的语言级别支持,相应的驱动也比较丰富。Python也提供语言级别的支持,同时第三方库十分丰富,甚至一种数据库有多个不同的连接库。另外值得一提的是, 尽管当前很多流行的分布式大数据平台及分布式数据库使用Java编写,但利用Python同样能够方便地基于第三方库实现操作Hbase、Hive以及其他非关系数据库,如Mongodb、Redis等,这种特点是C/C++不能比拟的。表2为Python与C++、Java在数据库操作上的比较。

由于Python对各种文件和数据库的支持都非常好,它十分适合编写数据库之间,数据库与文件之间相互导入导出数据的脚本,是大数据处理的首选语言。

3.3 数据可视化

丰富的可视化数据图形能够更好地对数据进行展示。利用数据可视化,可方便分析人员从宏观上了解数据的形态和分布,或者进行最后的结果展示。

Python提供了丰富的数据可视化工具,如pandas、Seaborn、Bokeh、matplotlib等。下面以matplotlib为例说明如何利用Python完成数据绘图与可视化。

假定我们要展现的数据用CSV格式保存,内容见表3。目标是基于matplotlib进行直观的数据总体分布展示,例如利用直方图统计年龄分布、利用箱体图展示薪资水平、利用散点图绘制年龄与收入的相关关系。完整代码如下:

import matplotlib.pyplot as plt

import pandas as pd

df = pd.read_csv("example.csv") /* 讀取数据 */

fig = plt.figure()

ax1 = fig.add_subplot(1,4,1) /* 定义展示布局 */

ax1.hist(df["Age"], bins = 5) /* 定义直方图 */

plt.axis([20,45,0,5])

plt.title("Age distribution")

plt.xlabel("Age")

plt.ylabel("Employee")

plt.show()

ax2 = fig.add_subplot(1,4,2) /* 确定图在画布中的位置 */

ax2.boxplot(df["Age"]) /* 定义箱线图 */

ax3 = fig.add_subplot(1,4,3)

ax3.bar(df["Age"],df["Income"]) /* 定义条形图 */

ax3.set_title("Income distribution")

ax3.set_xlabel("Age")

ax3.set_ylabel("Income")

ax4 = fig.add_subplot(1,4,4)

ax4.scatter(df["Age"],df["Income"]) /* 定义散点图 */

ax4.set_title("Income distribution")

ax4.set_xlabel("Age")

ax4.set_ylabel("Income")

plt.show()

得到的可视化效果如图1所示。

Python的开放性还表现为利用支持库,实现如图1所示的各类统计效果和复杂的展示(如地图、热力图以及复杂网络等)。此外,除了构建在Python之上的原生库,还有大量其他的数据可视化工具包(如基于Javascript的Plot.ly、百度的Echart等),这些工具包同时也提供Python的调用封装,丰富了基于Python的可视化效果,体现了强大的Python计算生态。

3.4 图像处理与深度神经网络

深度学习的出现点燃了研究者对神经网络和机器学习的研究热情,特别是基于Google Tensorflow的AlphaGo接连击败世界围棋冠军,更加吸引了人们对深度学习的关注。在深度学习领域,很多优秀的开源平台与框架(如Tensorflow、Caffe、Theano、MXNet等)都提供Python接口。这也从侧面反映出Python计算生态已经建立。下面以Tensorflow提供的Python接口为例,介绍Python在图像处理与深度神经网络方面的应用。

卷积神经网络是深度学习的一个重要模型。Tensorflow已经屏蔽了关于卷积神经网络的具体结构,如神经元函数、拓扑连接状态等。程序员只需要通过参数指定,就能完成网络模型的设计,例如

conv1 = tf.layers.conv2d(inputs=input_layer,filters=32,kernel_size=[5, 5], padding="same",activation=tf.nn.relu)

pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

通过设置输入层ID、激活函数、padding方法、核大小等参数,就可以唯一确定输入层、卷积层、池化层,再通过调整参数并选择一定的学习算法,结合pillow、scikit-image等基于Python的图像处理工具包,从而可以利用深度网络自动完成特征学习,完成模式识别或图像分类工作。

4 结 语

每一种程序设计语言的发展都与时代背景密切相关。Python作为一种开放性语言,具有简洁高效的特点,并且拥有丰富的标准库和第三方工具包,使得它处理起各类数据具有得天独厚的优势。教学实践证明,Python在输入输出、数据操作、数据可视化、图像处理与深度神经网络等有诸多优点,显示Python计算生态已经逐渐形成并不断完善。根据多年的实际教学效果来看,由于学生能够快速基于Python编写强大的应用模块,这对于提升学生学习兴趣、提高知识掌握水平,是大有裨益的。在今后的教学工作中,具有一定的推广价值。

参考文献:

[1] 王雪. 北理工承办“全国高校Python语言及计算生态教学研讨会”[EB/OL]. [2017-04-25]. http://www.bit.edu.cn/xww/zhxw/139071.htm.

[2] 黄文坚, 唐源. TensorFlow实战[M]. 北京: 电子工业出版社, 2017.

[3] 嵩天, 黄天羽, 礼欣. Python语言: 程序设计课程教学改革的理想选择[J]. 中国大学教学, 2016(2): 42-47.

[4] 嵩天, 黄天羽, 礼欣. Python语言程序设计基础[M]. 2版. 北京: 高等教育出版社, 2017.

[5] 车万翔, 苏小红, 袁永峰, 等. 计算机专业高级语言程序设计课程改革探索[J]. 计算机教育, 2014(13): 56-58.

[6] 张莉, 金莹, 张洁. 基于MOOC的“用Python玩转数据”翻转课堂实践与研究[J]. 工业和信息化教育, 2017(3): 70-76.

(编辑:彭远红)endprint

猜你喜欢
实验教学教学改革
基于科学探究的高中生物实验教学探索
网络与云技术在实验教学中的应用
初中化学实验教学中“微课”教学模式的探讨
谈初中化学实验教学的初探
基于人才培养的技工学校德育实效性研究
现代信息技术在高职数学教学改革中的应用研究
以职业技能竞赛为导向的高职单片机实践教学改革研究
微课时代高等数学教学改革的实践与探索