Python程序设计课程教学方法与教学重点探讨

Python语言是由荷兰人Guido van Rossum于1989年底开始设计1991年正式发行的,推出不久就迅速得到了各行业人士的青睐。Python是完全跨平台的语言,代码具有非常强的可移植性,几乎不需要改动即可运行于Unix、Linux、Solaris、Windows、Mac OS、Pocket PC、Symbian、Android等不同平台。更重要的是,Python可以和C/C++/C#、Java等主流语言完美地结合到一起,充分发挥每种语言的优势。Python易学易用且功能强大,目前已经渗透到统计分析、大数据处理、移动终端应用开发、科学计算可视化、逆向工程与软件分析、图形图像处理、人工智能、游戏设计与策划、网络程序设计、自动运维等几乎所有专业和领域。著名搜索引擎google的核心代码使用Python实现,迪斯尼公司的动画制作与生成采用Python实现,大部分Unix和Linux都内建了Python环境支持,豆瓣网使用Python作为主体开发语言进行网站架构和有关应用的设计与开发,网易大量网络游戏的服务器端代码超过70%采用Python进行设计与开发,易度的PaaA企业应用云端开发平台和百度云计算平台BAE也都大量采用了Python语言,美国宇航局使用Python实现了CAD/CAE/PDM库及模型管理系统,Yahoo使用Python建立全球范围的站点群,微软集成开发环境Visual Studio 2015开始默认支持Python语言而不需要像之前的版本一样再单独安装PTVS和IronPython插件,类似的案例数不胜数[1]

Python语言连续多年在TIOBE编程语言排行榜排名7、8位,2011年1月被TIOBE网站评为2010年度语言,在2014年12月IEEE Spectrum的编程语言排行榜中更是取得了第5名的好位次。目前Python已经成为卡耐基梅隆大学、麻省理工学院、加州大学伯克利分校、哈佛大学等国外很多著名大学计算机专业或非计算机专业的程序设计教学语言,国内如安徽大学、西安工业大学、山东师范大学、山东工商学院、新疆农业大学等校也针对部分专业开设了Python程序设计课程。

本文以Python 3.5为例,对Python编程模式和Python程序设计课程的教学重点进行剖析,同时简要比较和分析不同领域的主流Python扩展库。

Python编程模式与教学方法

Python是一门免费、开源的跨平台高级动态编程语言,支持命令式编程、函数式编程,完全支持面向对象程序设计,语法简洁清晰、优雅,代码可读性强,并且拥有大量功能丰富而强大的标准库和扩展库,可以帮助各领域的工程师、科研人员或策划师甚至管理人员快速实现和验证自己的思路与创意。Python编程模式非常符合人类的思维习惯,Python用户可以把主要精力放在业务逻辑的设计与实现上,大幅度缩短了开发周期,在开发速度和运行速度之间达到了完美的平衡,其精妙之处令人击节赞叹[2,3]

Python官方网站上在非常醒目的位置有一句话“Python is a programming language that lets you work quickly and integrate systems more effectively”,在The Zen of Python中也反复提到类似的话,例如“Explicit is better than implicit”、“Simple is better than complex”、“Flat is better than nested”、“Sparse is better than dense”、“Readability counts”,指出了Python语言的本质和核心所在。作为Python用户,尽量尝试从最自然、最简洁的角度出发去思考和解决问题,这样才能写出更加优雅、更加Pythonic的代码。在讲授Python程序设计课程时,建议采用边讲边练、学生分组合作的教学模式,精心设计一些案例带领学生一起完成并做好严格的过程控制与管理,同时经常鼓励和引导学生去想“还有没有更简洁更快速更直接更好的方法?”类似的问题,激发学生的潜能,也充分挖掘Python语言的潜能。

大部分讲授Python的老师都有其他语言的编程经验,听课的学生也很可能接触过其他编程语言。不少人认为Python不过是众多编程语言的其中一种而已,只要熟悉一下语法就可以掌握和应用,这样的想法是非常错误和危险的。在讲授、学习和应用Python时,切记不要把其他语言的编程习惯和风格带到Python中来使用其他语言尤其是C语言的思路去编写Python程序,那会使得代码变得非常冗、繁琐、可读性差并且难以维护,浪费大量的宝贵时间,无法发挥Python的优势,甚至有可能写出看似正确实则错误的代码

2 Python基础知识教学重点

2.1 代码规范

Python严格使用缩进来体现代码的逻辑关系,并且建议在运算符两侧各增加一个空格在不同的函数定义、类定义和不同功能代码之间增加一个空行,代码布局和逻辑非常清晰具有很强的可读性。在编写选择结构、循环结构以及定义函数和类时,一定要严格按照预期的逻辑关系对代码进行正确的缩进。在类定义、函数定义以及关键代码处,应使用简单的注释来说明逻辑关系和代码功能。另外,还有些习惯也是应该在学习Python之就应该养成的,例如每个import语句只导入一个模块,尽量避免使用类似于from numpy import *之类的写法,等等。从编写第一段Python代码开始,就要让学生养成良好的习惯[2,4]

2.2 关键字、变量、运算符与表达式

在任何编程语言中,关键字、变量、运算符、表达式都是最基本和最重要的内容,Python也不例外。在Python中,可以使用print(keyword.kwlist)语句查看所有关键字列表,并且不允许使用关键字作为变量、函数或类名。Python采用的是基于值的自动内存管理模式,变量不直接存储值,而是存储值的引用,这使得Python变量的使用非常灵活方便,例如在列表或元组等序列中可以同时存储不同类型的数据。在Python中,变量不需要提前声明,使用结束后也不需要刻意考虑变量的释放,同时还支持动态改变变量类型。下面的代码首先创建了整型变量x并赋值为3,然后先后将实数和字符串以及列表赋值给变量x,动态改变了变量的类型[2,3,5-8]

>>> x = 3

>>> type(x)

>>> x = 3.5

>>> type(x)

>>> x = 'SDIBT'

>>> type(x)

>>> x = [1, 2, "3", [4, 5]]

>>> type(x)

Python运算符类型较多,除了算术运算符、关系运算符、逻辑运算符等常规运算符之外,还有成员测试运算符in、同一性测试运算符is,,Python 3.5引入矩阵运算符@。Python中很多运算符具有多重含义,例如+运算符既可以用来实现整数、实数的加法运算,也可以实现字符串、元组、列表的连接;|运算符既可以用于数字的位或运算,可以实现集合的并集运算,等等。Python关系运算符不仅支持整数、实数、字符串、列表、元组的大小比较,还可以用来判断集合之间的包含关系,并且支持连续使用。下面的代码演示了部分运算符的用法。

>>> 3+5

8

>>> 'Hello '+'world'

'Hello world'

>>> (3,5)+(7,)

(3, 5, 7)

>>> 3 in _

True

>>> 3 | 5

7

>>> {1, 3, 5} | {7}

{1, 3, 5, 7}

>>> {1, 3, 5, 7} & {7}

{7}

>>> 5 & 3

1

>>> 1 < 20 > 5

True

2.3 Python序列

Python不仅提供了整数、实数、字符串等常见数据类型,还内置了列表、元组、字典、集合等功能强大的序列类型,同时range对象、reversed对象、map对象、文件对象以及其他可迭代对象也支持Python序列类似操作。序列可以说是Python最重要的一部分内容,也是实现业务逻辑的重要途径,这部分内容一定要精讲多练。

列表、元组、字符串等有序序列的双向索引大幅度提高了开发效率,单引号、双引号、三引号等灵活的字符串界定符和原始字符串可以让用户写出可读性更强的字符串而不需要借助于转义字符,正则表达式模块re更是把字符串处理功能发挥到了极致列表推导式、生成器推导式、字典推导式和集合推导式支持使用简洁的形式实现某些复杂功能,切片可以非常灵活地访问和修改列表元素,序列解包广泛应用于赋值、函数参数传递或枚举序列元素,这些都应该作为教学重点内容。下面的代码演示了Python序列的强大功能。

>>> range(20)[::2]

range(0, 20, 2)

>>> list(_)

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

>>> 'SDIBT'[-1]

'T'

>>> ''.join(map(chr,[random.randint(65,90) for i in range(20)]))

'EPYORZFZEDYAFVAJVFSC'

>>> x = list(range(10))

>>> x

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> x[::2] = [0]*(len(x)//2)

>>> x

[0, 1, 0, 3, 0, 5, 0, 7, 0, 9]

>>> x = [1, 2, 3]

>>> y = ['a', 'b', 'c']

>>> for item1, item2 in zip(x,y):

print(item1, item2)

1 a

2 b

3 c

2.4 带有else的循环结构和异常处理结构

在Python中,for循环while循环异常处理结构可以带有else子句。对于循环结构而言,当循环条件不成立时执行else中的代码,如果是执行了break语句跳出循环则不执行else中的代码。对于异常处理结构而言,如果try中的代码没有引发异常则执行else中的代码。带有else子句的循环结构和异常处理结构更符合人类的思维方式,可读性较强,同时也减少了代码量,是应该熟练掌握和运用的。

2.5 Python内置函数和标准库

Python提供了大量内置对象和内置函数以及标准库,这些代码都是经过反复推敲和优化的,运行稳定且具有非常高的效率,在编写代码时应优先考虑使用。教学中应培养学生经常浏览Python帮助文档的习惯,熟悉Python提供的内置对象和标准库功能,而不是遇到什么问题都首先想到自己写代码实现全部功能,这样才能获得高的开发效率。同时,为培养学生自学能力和获取新知识的能力,应要求熟练使用dir()函数查看模块中对象列表以及使用help()函数查看对象使用帮助。下面通过几个例子说明Python内置函数和标准库的强大功能。

虽然列表对象已经提供了原地排序方法sort(),内置函数sorted()则提供了更强大的功能,可以实现列表、元组、字典以及range和其他可迭代对象的复杂排序。例如下面的代码[2]

>>> import random

>>> x = [[random.randint(1, 100) for j in range(3)] for i in range(3)]

>>> x

[[100, 59, 31], [52, 98, 61], [32, 49, 95]]

>>> sorted(x, key=lambda x: x[1]) #按子列表第1个元素进行升序排序

[[32, 49, 95], [100, 59, 31], [52, 98, 61]]

>>> sorted(x, key=lambda x: x[2], reverse=True) #按子列表第2个元素降序排序

[[32, 49, 95], [52, 98, 61], [100, 59, 31]]

>>> x.sort()  #默认按子列表第0个元素升序排序

>>> x

[[32, 49, 95], [52, 98, 61], [100, 59, 31]]

>>> x.sort(key=lambda x:x[1]) #按子列表第1个元素升序排序

>>> x

[[32, 49, 95], [100, 59, 31], [52, 98, 61]]

>>> import operator

>>> gameresult = [{'name':'Bob', 'wins':10, 'losses':3, 'rating':75.0},              {'name':'David', 'wins':3, 'losses':5, 'rating':57.0},              {'name':'Carol', 'wins':4, 'losses':5, 'rating':57.0},              {'name':'Patty', 'wins':9, 'losses':3, 'rating':72.8}]

>>> sorted(gameresult, key=operator.itemgetter('wins', 'name'))

[{'name': 'David', 'wins': 3, 'losses': 5, 'rating': 57.0}, {'name': 'Carol', 'wins': 4, 'losses': 5, 'rating': 57.0}, {'name': 'Patty', 'wins': 9, 'losses': 3, 'rating': 72.8}, {'name': 'Bob', 'wins': 10, 'losses': 3, 'rating': 75.0}]

计算两个整数的最大公约数,接触过其他语言的人可能会首先想到按照欧几里得算法编写下面的代码:

>>> def gcd(m, n):

    if m>n:

        m, n = n, m

    while m != 0:

        r = n % m

        n = m

        m = r

return n 

然而,Python标准库fractions已经提供了用于计算最大公约数的方法gcd(),直接调用即可。例如:

>>> import fractions

>>> fractions.gcd(40, 32)

8

>>> fractions.gcd(64, 32)

32

再例如,如果需要求解若干数的中位数,需要先对所有数据进行排序然后返回中间位置上的数,如果自己编写代码求解中位数会耗费一定的时间,而Python标准库statistics已经提供了median()函数来解决这一问题。例如:

>>> import random

>>> x = list(range(1,10))

>>> x

[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> random.shuffle(x)

>>> x

[2, 4, 5, 8, 6, 1, 3, 7, 9]

>>> import statistics

>>> statistics.median(x)

5

类似的情况在Python中数不胜数,标准库itertools提供了用于计算排列的函数permutations()和计算组合的函数combinations()以及用于循环遍历指定序列的函数cycle(),标准库random提供了用于从指定序列中随机选择k个元素的函数sample()和将列表数据随机打乱顺序的函数shuffle(),标准库datetime提供了timedelta对象可以很方便计算指定年、月、日、时、分、秒之前或之后的日期时间以及返回结果包含了“今天是今年第几天”、“今天是本周第几天”等答案的timetuple()函数,等等。

2.6 Lambda表达式

lambda表达式可以用来声明匿名函数或具名函数,尤其适合临时需要某个功能而又不值得定义函数的场合lambda表达式只包含一个表达式,该表达式的计算结果可以看做函数的返回值。Python中很多函数和方法都支持lambda表达式作为参数,本文前面示例中已经展示lambda表达式的强大功能,再例如下面的代码:

>>> f = lambda x: x**3 + x**2 + 1

>>> f(3)

37

>>> f(2)

13

>>> import itertools

>>> x = [1, 2, 3, 4, 5]

>>> list(itertools.accumulate(x, lambda a,b: a*b))

[1, 2, 6, 24, 120]

>>> list(itertools.accumulate(x, lambda a,b: b-a))

[1, 1, 2, 2, 3]

>>> import functools

>>> functools.reduce(lambda a,b:b-a,range(1,10))

5

>>> functools.reduce(lambda a,b:a+b,range(10))

45

Python标准库和扩展库简介

Python拥有大量涉及几乎所有领域的标准库和扩展库,并且绝大部分扩展库都支持使用pip工具进行安装和管理。需要说明的是,不论针对哪个领域的应用开发,也不论选择哪个标准库或扩展库,Python运算符、序列、各种推导式、程序控制结构、异常处理结构、文件操作等基本知识都是非常重要的,只有完全理解和熟练掌握这些Python基础知识才能更有效地运用各种扩展库。另外,在每个行业和领域都有很多扩展库可供选择很多扩展库各有特点,互相之间并没有严格的优劣之分,选择使用哪个扩展库更多的是个人喜好和习惯。本文尝试对部分领域的主流Python扩展库进行简介绍,在教学过程中可根据具体的学生专业进行适当选取。

3.1 GUI编程

在GUI编程方面,主流的有Tkinter、wxPython、PyQt、PyGTK、PySideAutoPy等模块。其中Tkinter是Python标准库,可在Python所有版本中直接使用。wxPython是功能强大的平台GUI扩展库,遗憾的是目前最高只支持Python 2.7,近几年更新有点缓慢。尽管Python的有关GUI库已经比较成熟,但使用纯Python编写应用程序界面的效率仍然相对较低。可以考虑和其他语言结合,例如使用C#或Java的集成开发环境来搭建应用程序界面,而使用Python来实现业务逻辑,充分发挥不同语言的优势[3]

3.2 网络编程

除了socket、urllib、cookielib、httplibftplib、email、smtp、html、json等适用于不同目的的网络编程标准库之外,还有Django、Flask、webpy、Zope2、Pyramid、web2py、Bottle、TornadoGenshi等支持Python网站开发框架和扩展库。也可以把Python语言直接嵌入asp文件来实现特定功能,IIS以及Apache支持直接使用纯Python开发和运行网站系统。Scrapy作为屏幕抓取和Web抓取框架,也得到了广泛的应用[3]

3.3 大数据处理

MapReduce、Hadoop、Spark是目前比较主流的大数据处理平台和框架,都可以和Python语言完美结合。DPark是Spark的Python实现,是一个Python实现的分布式计算框架,可以非常方便地实现大规模数据处理和迭代计算。作为高性能数据处理扩展包,pandas近几年也表现出了足够强大的功能[3]

3.4 系统编程与多语言混合编程

大多数版本的Unix和Linux发行版本都集成了Python支持,os、sys、platform等标准库中含有大量的与操作系统编程有关的方法和类。pywin32扩展库提供了win32api、win32con、win32process、win32event、win32gui等模块,支持Python对Windows几乎所有底层功能的访问和调用。扩展库wmi使得Python可以访问Windows系统中硬盘分区与使用情况,内存大小,CPU型号,当前运行的进程,自启动程序及位置,系统版本等信息。Python标准库_winreg提供了Windows注册表编程的有关接口。跨平台扩展库psutil支持Python对CPU信息、开机信息、当前用户、磁盘信息、内存信息甚至网络流量和收发包情况的查看和分析。

cytpes标准库支持在Python中调用动态链接库或共享库中的函数,Boost.Python扩展库在C++和Python之间实现了完美的互操作性,利用Cffi扩展库可以在Python中调用C语言代码,利用Cython可以编写Python的C扩展,IronPython插件允许在C#中直接嵌入Python代码或者调用外部Python程序文件中的代码,Jpype使得Python可以拥有Java类库的访问权。JPython 是 Python 语言的纯Java实现,可以将Python源代码编译成Java字节码并在任何Java虚拟机上运行,是Python与Java的完美集成[3]

3.5 线程编程与进程编程

Python标准库threading是高层线程编程接口,提供了大量的方法和类支持多线程编程,包括线程的创建、运行与状态控制以及线程同步操作,极大地方便了用户。标准库queue实现了多生产者-消费者队列,非常适合在多个线程之间进行信息交换的场合。标准库multiprocessing提供了大量用于进程编程的类和方法。另外,pywin32扩展库中的win32process也使得Python可以很方便地创建和控制进程,psutil扩展库支持对进程、线程等信息的访问和一定程度的控制[3]

3.6 数据库编程

标准库sqlite3和扩展库APSW支持python对内置数据库SQLite的操作,SQLiteManager、SQLite Database Browser等工具支持SQLite数据库的可视化操作。Python可以使用pywin32访问ACCESS和MSSQLSERVER数据库,也可以使用pymssql扩展库访问MSSQLSERVER数据库。MySQLDb、MySQL-python、Mysqlclient等扩展库支持Python访问MySQL数据库,借助于cx_Oracle、bsddb3扩展库Python可以操作Oracle数据库,扩展库pyodbc或Sybase支持Python对Sybase数据库的访问。Excel文件是很多单位经常采用的数据存储和处理方式,Python扩展库xlrd、xlwt、openpyxl很好地支持对Excel文件的操作[3]

3.7 多媒体编程与游戏编程

Python扩展库PyOpenGL完美封装了图形编程库OpenGL的几乎所有功能,具有完全一致的接口;PIL、pillow是目前主流的Python图像处理扩展库;Phonon提供了跨平台的音频、视频文件播放功能,也可以使用DirectSound或WMPlayer.ocx控件进行音乐文件播放。借助于pywin32和Microsoft Speech SDK的支持,Python扩展库speech很好地实现了语音识别功能。游戏编程扩展库pygame中除了完美地支持主流音乐格式的播放与控制的mixer模块,还提供了用于游戏设计与开发的display、event、image、mouse、key、surface等模块[3]

3.8 逆向工程与软件分析

Immunity Debugger是非常成熟的基于Python开发的调试器,提供内置的Python接口和专门用于研究软件漏洞和执行恶意软件分析的强大API。PyEmu是可编写脚本的模拟器,对恶意软件分析非常有用;Paimei是完全使用Python编写的逆向工程框架,包括PyDBG、PIDA和pGRAPH等多个可扩展模块,可以执行大量静态分析和动态分析功能。ropper是比较成熟的ROP Gadgets查找与可执行文件分析工具,其反汇编部分使用了成熟的Capstone框架。WinAppDbg也是一款非常好的调试器,可以将自己编写的Python脚本附加为调试器、跟踪执行、拦截API调用,并且支持各种断点的设置、跟踪与分析。IDAPython是运行于交互式反汇编器IDA中的插件,用于实现IDA的Python编程接口,IDAPython插件使得Python程序能够在IDA中运行,通过该插件运行的Python程序可以访问整个IDA数据库,并且可以方便地调用IDC函数和所有已安装的Python模块。另外,扩展库pefile支持使用Python查看PE文件的详细信息,pydasm扩展库支持使用Python对PE文件进行反汇编[3]

3.9 科学计算、统计分析与可视化

用于科学计算与可视化的Python模块非常多,例如NumPy、SciPy、SymPy、Matplotlib、Traits、TraitsUI、Chaco、TVTK、Mayavi、VPython、OpenCVPandas等等。其中,NumPy是非常成熟的科学计算包,提供了Python中没有的数组对象,支持N维数组运算、大型矩阵处理、广播函数库、矢量运算、线性代数、傅里叶变换以及随机数生成等功能,并可与C++、FORTRAN等语言无缝结合。SciPy模块依赖于NumPy,提供了更多的数学工具,包括矩阵运算、线性方程组求解、积分、优化等等。Python标准库statistics提供了中值、方差、标准差等统计有关的方法。扩展库Gensim是成熟的快速向量空间模型化框架。Glumpy提供了numpy和OpenGL互相访问的接口。Imread扩展库可以把图像读入numpy数组。mmLib和MMTK提供了分子模拟需要的大部分功能。NLopt是用于非线性最优化的扩展库。NLTK是依赖于pyyaml的自然语言处理工具包。PyCluster实现了基因表达数据分析的聚类方法。PyMVPA扩展库可以执行多元模式分析功能。PyOpenCL提供了对OpenCL并行计算API的访问。PyWavelets提供了离散小波变换有关的功能。扩展库Sympy提供了符号计算所需要的功能。Matplotlib是比较常用的绘图模块,可以快速地将计算结果以多种形式的图形展示出来。GR提供了跨平台可视化应用的通用框架。跨平台的开源计算机视觉库opencv自1999年推出以来版本不断更新且经久不衰,在该领域得到了广泛的应用。IPython作为增强版的Python交互式Shell,在数据分析和科学计算领域具有较高的认可度[3]

3.10 移动终端编程

目前移动终端应用开发的市场前景已经势不可挡。Python程序具有非常强的可移植性,可以运行于Symbian、AndroidiOS等主流移动终端系统平台,而QPython、QPython3和Compiler则支持在移动终端设备上直接使用Python语言进行编程。Python for Android项目可以帮助程序员创建Python应用并打包为可在Android设备运行的APK文件[2]

3.11 密码学编程

标准库hashlib、hmac、zlib提供了md5和sha系列算法以及循环冗余检验算法,Crc16、Crcmod可用于计算循环冗余校验码。扩展库rsa提供了RSA密码学算法和有关的加密解密功能。PyCrypto是一个免费的Python密码算法工具包,支持常见的DES、DES3、AES、RSA、DSA、CAST、ARC4加密以及MD5、SHA、SHA224、SHA256、SHA384、SHA512等各种HASH运算,同时还支持增强版的随机数生成算法和数字签名算法[3]

3.12 人工智能与机器学习编程

Fann2是非常成熟的用于神经网络计算的Python扩展库,Ffnet是用于前馈神经网络(feed-forward neural network)计算的Python扩展库,Fastcluster是高性能集群计算扩展库,LIBSVM是Python的支持向量机扩展模块,Milk和Mlpy是用于机器学习的Python工具包和扩展库,Biopython是一套非常成熟的针对生物计算而开发的扩展库,MultiNEAT是比较成熟的神经进化模拟库,Scikit-learn集成了大量经典机器学习算法[9]

结语

Python语法简洁清晰,代码具有很强的可读性,易学易用,并且拥有大量适用于不同应用领域开发的扩展库,具有强大的系统整合能力,目前已经在数据分析与处理、逆向工程与软件分析、游戏开发、图形图像处理、网络程序开发、自动运维等多个领域得到广泛应用。近几年来,很多高校多个专业陆续开设了Python程序设计课程,但国内关于Python教学模式和重点的研究较少。结合多年Python教学工作和实际开发中总结的经验,对Python编程模式和教学重点进行了剖析,并简要介绍了多个领域中主流的Python扩展库。对Python编程模式进行了深入剖析,对Python的应用领域进行了认真梳理,对国内Python程序设计教学工作有极大的促进作用。

参考文献:

[1肖旻,陈行基于Python语言编程特点及应用之探讨[J]. 电脑知识与技术, 2014, 10(34), p8177-8178

[2董付国. Python程序设计基础[M]. 北京:清华大学出版社, 2015.8

[3董付国. Python程序设计[M]. 北京:清华大学出版社, 2015.8

[4张颖,赖勇浩著编写高质量代码——改善Python程序的91个建议[M]. 机械工业出版社, 2014

[5杨佩璐,宋强等编著. Python宝典[M]. 北京:电子工业出版社, 2014

[6袁国忠译. Python编程入门[M]. 北京:人民邮电出版社, 2013

[7张若愚著. Python科学计算[M]. 北京:清华大学出版社, 2012

[8赵家刚,狄光智,吕丹桔等编计算机编程导论——Python程序设计[M]. 北京:人民邮电出版社, 2013

[9李锐,李鹏,曲亚东等译机器学习实战[M]. 北京:人民邮电出版社, 2013 


原文地址:http://user.qzone.qq.com/306467355/blog/1448869087

更多精彩内容请访问作者QQ空间。

你可能感兴趣的:(Python程序设计,教学重点)