2.1 Python概述
2.1.1 Python的发展史
Python语言的创始人为吉多·范·罗苏姆(Guido van Rossum)(图2-1),荷兰人,1982年获得阿姆斯特丹大学数学和计算机科学硕士学位,并于同年加入一个多媒体组织CWI(Centrum Wiskunde & Informatica),成为一名调研员。
图2-1 吉多·范·罗苏姆(Guido van Rossum)
1989年,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,创造一种介于C和shell之间、功能全面、易学易用、可拓展的语言。最后他将这个语言起名为Python,因为他喜欢电视剧Monty Python’s Flying Circus。
1991年,Python的第一个公开版本发布,它采用C语言实现,能够调用C语言的库文件,包含表、字典等核心数据类型,并具有类、函数、异常处理等的算法,采用基于模块的可扩展系统架构。
经过近30年的发展,Python目前已进化到3.6.5版本。其应用范围之广,影响之深远,恐怕连Guido van Rossum自己也没有想到。各版本推出时间如下:
Python 0.9.0——1991年9月;
Python 1.0——1994年1月(增加了lambda、map、filter和reduce);
Python 2.0——2000年10月(加入了内存回收机制,构成了现代Python语言框架的基础);
Python 2.4——2004年12月(同年WEB框架Django诞生);
Python 2.5——2006年9月;
Python 2.6——2008年10月;
Python 2.7——2010年7月;
Python 3.0——2008年12月;
Python 3.1——2009年6月;
Python 3.2——2011年2月;
Python 3.3——2012年9月;
Python 3.4——2014年3月;
Python 3.5——2015年9月;
Python 3.6——2016年12月;
Python 3.7.0——2018年6月。
本书主要基于版本3.6讲解,它是目前应用最广泛的版本。由于Python 3.X版本不再向后兼容,所以建议读者采用3.6及以后的版本。
2.1.2 Python应用领域
作为一门优秀的编程语言,Python的应用领域非常广泛,可在如下领域大显身手。
① 数据分析,这是Python的主要应用领域之一。2016年2月,美国科学家根据对过去三十年观测数据的分析,发现了引力波,所采用的数据分析工具就是Python包GWPY。
② 云计算,如使用Python开发的OpenStack。
③ WEB开发,包括众多优秀的WEB框架,例如Django、flask、tornado等。
④ 科学计算,人工智能开发,典型模块如NumPy、SciPy、Matplotlib、Enthought Librarys、Pandas等。
⑤ 系统运维,例如运维人员必备的SaltStack(系统自动化配置和管理工具)、Ansible(自动化运维工具)等。
⑥ 图形开发,工具有easyGUI、wxPython、PyQT、TKinter等。
目前,Google、NASA、Dropbox、Red Hat、YouTube、Facebook等公司都在大力使用Python作为应用开发语言,国内搜狐、金山、腾讯、盛大、网易、百度、阿里、淘宝、土豆、新浪、果壳等公司都在使用Python完成各种各样的任务。
读者可以在网站https://www.python.org/about/success/上获取更多关于Python的信息。
2.1.3 Python的优缺点
任何一种编程语言都有其优缺点,Python也不例外。作为一门优秀的编程语言,Python主要有以下优点。
① 优雅、明确、简单,Python程序看上去简单易懂,初学者不但入门容易,而且还容易深入进去编写非常复杂的程序。
② 开发效率高。Python的标准库庞大,可以帮助开发者处理诸如正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk等;除了标准库,还有许多其它高质量库,如wxPython、Twisted、Scikit-Learn、Statsmodels、PyMC、Nolearn等,应有尽有,开发者可直接下载调用,或在基础库的基础上再度进行开发,可大大降低开发周期,避免重复造轮子。这点类似于R语言。
③ Python属于高级语言,编程时无需考虑怎样管理程序使用的内存等底层细节。
④ 可移植性强。由于它的开源本质,Python可被安装在大多数平台上。如果不使用那些依赖于具体系统的功能,Python程序无需修改就可以在几乎所有平台上运行,包括Linux/Unix、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE,甚至还有PocketPC、Symbian以及Google基于linux开发的Android平台。
⑤ 极强的可扩展性。如果希望某段代码运行得更快或者某些算法不公开,可以把这部分代码用C或C++编写,然后在Python程序中使用。
⑥ 灵活的可嵌入性。可以把Python嵌入C/C++程序,从而向最终用户提供脚本功能。
⑦ 免费、开源。Python是FLOSS(自由/开放源码软件)之一,使用者可以自由发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。
⑧ 面向对象的编程。Python既支持面向过程的编程,也支持面向对象的编程。与C++和Java相比,Python的面向对象编程更简洁而强大。
⑨ 代码具有极佳的可读性,Python采用强制缩进的方式,使代码具有良好规范,带来了极佳的可读性。
Python也有缺点:一是代码不能加密,因为Python是解释性语言,源码一般都以明文形式存放,如果必须加密,可以先进行编译,进行pyc处理后再加密,类似于Java的class文件;二是相对C/C++而言,性能弱一些。当然,Java、R等语言和C/C++相比,性能也都不如C/C++。
以上两个缺点对于从事应用级别程序开发的人员都不是什么问题,所以Python在众多开发语言中的地位越来越突出,受到越来越多的青睐,而且Python语言考试也被纳入2018年全国计算机等级考试大纲。
2.1.4 Python 解释器
Python是一门跨平台的动态解释性脚本语言,其程序由解释器来翻译(解释)运行。Python的解释器很多,常用的有以下几种。
1)Cpython
Cpython是Python官方版本的内置解释器,采用C实现,使用最为广泛。Cpython将源代码程序(py文件)转换成字节码文件(pyc文件),然后在Python虚拟机运行上,见图2-2。本书后续内容主要基于Cpython解释器讲解。
图2-2 Cpython解释器运行机制
2)Jython
采用Java实现,Jython将Python代码动态编译成Java字节码,然后在JVM上运行。
3)IronPython
采用C#实现,IronPython将Python代码编译成C#字节码,然后在公共语言运行库CLR(Common Language Runtime)上运行。也就是把Python程序编译成.net程序来执行。
4)PyPy
采用Python实现。PyPy将Python的字节码再编译成机器码,大大加快Python程序的运行速度。
还有一些其它解释器,例如RubyPython、Brython 等,在此不一一介绍,有兴趣的读者可在网上查阅。
如果要和Java或.Net平台交互,最好的办法是通过网络调用实现,保持各程序之间独立,而不采用Jython或IronPython。
提 醒
当在一个py文件中调用另外一个py文件时,只有被调用的py文件才会被编译成pyc文件,并保存同一目录下的“__pycache__”文件夹内;下次再调用这个py文件时,Python会自动检查它和它的pyc文件的时间戳是否一致,如果这个py文件没有被修改过,则时间戳一致,就跳过编译步骤直接加载pyc文件;如果这个py文件被修改过,则时间戳不一致,它会被重新编译,生成新的pyc文件,覆盖原来的pyc文件。
为便于理解,以图2-3所示主程序对模块的引用为例来说明,图中模块model_0.py被主程序model_main.py导入,会生成字节码文件model_0.cpython-36.pyc,文件名称中的“cpython-36”表示用的解释器是Cpython,当前Python的版本号为3.6。而主程序model_main.py不会被生成pyc文件。
图2-3 Python主程序对模块的引用