1.1 认识Python
1.1.1 Python的发展历程
Python的创始人为荷兰的Guido van Rossum(见图1-1)。1989年,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。之所以选中Python作为该编程语言的名字,是因为他是一个叫Monty Python喜剧团体的爱好者。
图1-1 Python创始人
ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido认为是其非开放造成的。Guido决心在Python中避免这一错误,同时,他还想实现在ABC中闪现过但未曾实现的东西,就这样,Python在Guido手中诞生了。可以说,Python是从ABC发展起来的,主要是受到了Modula-3的影响,并且结合了Unix shell和C的习惯。
1991年,Python第一个公开发行版本发行,它是一种面向对象的解释型计算机程序设计语言,它是使用C语言实现的,并且能够调用C语言的库文件。从一出生,Python已经具有了类、函数、异常处理,包含列表和字典在内的核心数据类型,以及模块为基础的拓展系统。
最初的Python完全由Guido本人开发。Python得到Guido同事的欢迎,他们迅速地反馈使用意见,并参与到Python的改进中。Guido和一些同事构成Python的核心团队,他们将自己大部分的业余时间用于发掘Python。随后,Python拓展到研究所之外。Python将许多机器层面上的细节隐藏,交给编译器处理,并凸显出逻辑层面的编程思考。Python程序员可以花更多的时间用于思考程序的逻辑,而不是具体的实现细节,这一特征吸引了广大的程序员,Python开始流行。2011年1月,Python赢得TIOBE编程语言排行榜的年度语言。
1.1.2 Python的特点
Python具有以下显著的特点。
(1)简单易学
Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语段落一样,尽管这个英语段落的语法要求非常严格。Python最大的优点之一是具有伪代码的本质,它使我们在开发Python程序时,专注的是解决问题,而不是搞明白语言本身。
(2)开源
Python是FLOSS(自由/开放源码软件)之一。简单地说,你可以自由地发布这个软件的拷贝,阅读它的源代码,对它做改动,把它的一部分用于新的自由软件中。FLOSS 是基于一个团体分享知识的概念,这是为什么Python如此优秀的原因之一——它是由一群希望看到一个更加优秀的Python的人创造并经常改进着的。
(3)高级语言
Python是高级语言。当使用Python语言编写程序时,无需再考虑诸如如何管理程序使用的内存一类的底层细节。
(4)可移植性
由于Python的开源本质,它已经被移植在许多平台上。如果小心地避免使用依赖于系统的特性,那么所有Python程序无需修改就可以在下述任何平台上运行。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acorn RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE,甚至还有PocketPC、Symbian以及Google基于Linux开发的Android平台。
(5)解释性
一个用编译性语言如C或C++写的程序可以从源文件(即C或C++语言)转换到一个计算机使用的语言。这个过程通过编译器和不同的标记、选项完成。当运行程序的时候,连接/转载器软件把程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码,可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于不再担心如何编译程序,如何确保连接转载正确的库等,这一切使得使用Python变得更加简单。由于只需要把Python程序复制到另外一台计算机上,它就可以工作了,这也使得Python程序更加易于移植。
(6)面向对象
Python既支持面向过程编程,也支持面向对象编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。
(7)可扩展性
如果需要一段关键代码运行的更快或者希望某些算法不公开,就可以把部分程序用C或C++语言编写,然后在Python程序中使用它们。
(8)丰富的库
Python标准库确实很庞大。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等。
(9)规范的代码
Python采用强制缩进的方式使得代码具有极佳的可读性。
1.1.3 Python的应用领域
Python应用的领域包括如下场景。
(1)Web应用开发
Python经常被用于Web开发。例如,通过mod_wsgi模块,Apache可以运行用Python编写的Web程序。Python定义了WSGI标准应用接口来协调HTTP服务器与基于Python的Web程序之间的通信。一些Web框架,如Django、TurboGears、web2py、Zope等,可以让程序员轻松地开发和管理复杂的Web程序。
(2)操作系统管理、服务器运维的自动化脚本
在很多操作系统里,Python是标准的系统组件。大多数Linux发行版以及NetBSD、OpenBSD和Mac OS X都集成了Python,可以在终端下直接运行Python。有一些Linux发行版的安装器使用Python语言编写,如Ubuntu的Ubiquity安装器,Red Hat Linux和Fedora的Anaconda安装器。Gentoo Linux使用Python来编写它的Portage(包管理系统)。Python标准库包含了多个调用操作系统功能的库。通过pywin32这个第三方软件包,Python能够访问Windows的COM服务及其他Windows API。使用IronPython,Python能够直接调用.Net Framework。一般说来,Python编写的系统管理脚本在可读性、性能、代码重用度、扩展性几方面都优于普通的shell脚本。
(3)科学计算
NumPy、SciPy、Matplotlib可以让Python程序员编写科学计算程序。
(4)桌面软件
PyQt、PySide、wxPython、PyGTK是Python快速开发桌面应用程序的利器。
(5)服务器软件(网络软件)
Python对于各种网络协议的支持很完善,所以经常被用于编写服务器软件、网络爬虫。第三方库Twisted支持异步网络编程和多数标准的网络协议(包含客户端和服务器),并且提供了多种工具,被广泛用于编写高性能的服务器软件。
(6)游戏
很多游戏使用C++编写图形显示等高性能模块,而使用Python或者Lua编写游戏的逻辑、服务器。相较于Python,Lua的功能更简单,体积更小;而Python则支持更多的特性和数据类型。
(7)构思实现,产品早期原型和迭代
YouTube、Google、Yahoo!、NASA都在内部大量地使用Python。
1.1.4 Python的版本
Python发展到现在,经历了多个版本,大家可以在Python官网查看。网址是https://www.python.org/downloads/。截至目前,仍然保留的版本主要是基于Python 2.x和Python 3.x。表1-1列举了Python的历史版本。
表1-1 Python历史版本
续表
在本书成稿时,Python 2的最新版本是Python 2.7.13,Python 3的最新版本是Python 3.6。关于Python 2.x和Python 3.x的区别将在下个小节进行介绍,这里大家只需知道,Python 3.x不再兼容现有的2.x程序,在实际使用时,大家要根据实际情况选择使用的版本。
1.1.5 Python 2.x和Python 3.x版本区别
和Python 2.x版本相比,Python 3.x版本在语句输出、编码、运算和异常等方面做出了一些调整,具体如下。
1.print函数替代了print语句
在Python 2.x中,输出数据使用的是print语句。但是在Python 3.x中,print语句没有了,取而代之的是print函数。示例代码如下:
Python 2.x
>>> print(3,4)
(3, 4)
Python 3.x
>>> print(3,4)
3 4
2.Python 3.x默认使用UTF-8编码
Python 2.x中有ASCII Str()类型,unicode()是单独的,不是byte类型。在Python 3.x版本的源代码中,默认使用的是UTF-8编码,从而可以很好地支持中文或其他非英文字符。例如,输出一句中文,使用Python 2.x和Python 3.x的输出结果如下所示:
Python 2.x
>>> str = "我爱北京天安门"
>>> str
'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'
Python 3.x
>>> str = "我爱北京天安门"
>>> str
'我爱北京天安门'
3.除法运算
和其他语言相比,Python语言的除法非常高端,它的除法运算包含两个运算符,分别是/和//,这两个运算符在Python 2.x和Python 3.x中的使用如下所示。
(1)运算符 /
在Python 2.x中,使用运算符/进行除法运算的方式和Java、C语言相似,整数相除的结果是一个整数,浮点数除法会保留小数点的部分得到一个浮点数的结果。但是,在Python 3.x中使用运算符/进行除法运算,整数之间的相除,结果也会是浮点数。示例代码如下:
Python 2.x
>>> 1 / 2
0
>>> 1.0 / 2.0
0.5
Python 3.x
>>> 1/2
0.5
(2)运算符//
使用运算符//进行的除法运算叫作floor除法,这种除法会对除法的结果自动进行一个floor操作。使用这种运算符进行的除法运算,在Python 2.x和Python 3.x中是一致的。示例代码如下:
Python 2.x
>>> -1 // 2
-1
Python 3.x
>>> -1 // 2
-1
需要注意的是,使用运算符//进行的除法是执行floor操作,即获取不大于结果值的最大整数(向下取整)。
4.异常
在Python 3.x版本中,异常处理改变的地方主要如下。
(1)在Python 2.x版本中,所有类型的对象都是直接被抛出的,但是在Python 3.x版本中,只有继承自BaseException的对象才可以被抛出。
(2)在Python 2.x版本中,捕获异常的语法是“except Exception, var”。在Python 3.x版本中,引入了as关键字,捕获异常的语法变更为“except Exception as var”。
(3)在Python 2.x版本中,处理异常使用“raise Exception(args)”;在Python 3.x版本中,处理异常使用“raise Exception, args”。
(4)Python 3.x版本中取消了异常类的序列行为和.message属性。
关于Python 2.x版本中和Python 3.x版本中处理异常的示例代码如下:
Python 2.x
>>> try:
... raise TypeError,"类型错误"
... except TypeError,err:
... print err.message
...
类型错误
Python 3.x
>>> try:
... raise TypeError("类型错误")
... except TypeError as err:
... print(err)
...
类型错误
5.八进制字面量表示
在Python 3.x中,表示八进制字面量的方式只有一种,并且必须写成“0o1000”这样的方式,原来“01000”的方式不能使用了。示例代码如下:
Python 2.x
>>> 0o1000
512
>>> 01000
512
Python 3.x
>>> 01000
File "<stdin>", line 1
01000
^
SyntaxError: invalid token
>>> 0o1000
512
6.不等于运算符
Python 2.x的不等于运算符有两种写法:!= 和 <>,但是,Python 3.x中去掉了<>, 只有!=一种写法。示例代码如下:
Python 2.x
>>> 1!=2
True
>>> 1<>2
True
Python 3.x
>>> 1!=2
True
>>> 1<>2
File "<stdin>", line 1
1<>2
^
SyntaxError: invalid syntax
>>>
7.数据类型
Python中数据类型的改变如下。
(1)Python 3.x去除了long类型,现在只有一种整型int,但它的行为就像是Python 2.x版本的long。
(2)Python 3.x新增了bytes类型,对应于Python 2.x版本的八位串,定义一个bytes字面量的方法如下所示:
>>> b = b'china'
>>> type(b)
<type 'bytes'>
字符串对象和bytes对象可以使用.encode() (str→bytes) 或者 .decode() (bytes→str)方法相互转化。示例代码如下:
>>> s = b.decode()
>>> s
'china'
>>> b1 = s.encode()
>>> b1
b'china'
(3)Python 3.x中,字典的keys()、items()和values()方法用返回视图代替了列表,而2.x版本中的iterkeys()等函数都被废弃。同时去掉的还有has_key()方法,用in替代。