
1.2 了解Python
1.2.1 Python简介
Python是一种强大的计算机编程语言。它与最早的编程语言之一Fortran有一些相似之处,但它比Fortran强大得多。Python允许在不声明变量的情况下使用变量(即,它隐式地确定类型),并且它依赖于缩进作为控制结构。
Python是一种具有动态语义的解释型高级编程语言。其内置数据结构,结合动态类型和动态绑定,使其对快速应用程序开发非常有吸引力,并且可用作脚本或黏合语言将现有组件连接在一起。Python简单易学的语法强调可读性,因此降低了程序维护的成本。Python支持模块和包,鼓励程序模块化和代码重用。Python解释器和广泛的标准库以源代码或二进制形式提供,不收取主要平台的费用,可以免费分发。
Python的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进划分代码块,而非使用大括号或者关键词)。相比于C++和Java,Python让开发者能够用更少的代码表达想法。不管是小型还是大型程序,该语言都能让程序的结构清晰明了。Python拥有动态类型系统和垃圾回收功能,能够自动管理内存使用,并且支持多种编程范式,包括面向对象、命令式、函数式和过程式编程,还拥有一个巨大而广泛的标准库。
1.2.2 Python的起源与发展
Python的创始人为吉多·范罗苏姆(Guido van Rossum),吉多·范罗苏姆是荷兰人,生于荷兰哈勒姆,计算机程序员,为Python程序设计语言的最初设计者及主要架构师,大家都称他为“龟叔”。在Python社区,吉多·范罗苏姆被人们认为是“终身仁慈独裁者(BDFL)”,意思是他仍然关注Python的开发进程,并在必要的时刻做出决定。2018年7月12日,他宣布不再担任Python社区的BDFL。
1982年,吉多·范罗苏姆从阿姆斯特丹大学(University of Amsterdam)获得了数学和计算机硕士学位。然而,尽管他算得上是一位数学家,但他更加享受计算机带来的乐趣。用他的话说,尽管拥有数学和计算机双料资质,他总趋向于做计算机相关的工作,并热衷于做任何和编程相关的事情。
关于Python的起源,吉多·范罗苏姆在1996年写道:
Over six years ago, in December 1989, I was looking for a "hobby" programming project that would keep me occupied during the week around Christmas. My office (a government-run research lab in Amsterdam) would be closed, but I had a home computer, and not much else on my hands. I decided to write an interpreter for the new scripting language I had been thinking about lately: a descendant of ABC that would appeal to Unix/C hackers. I chose Python as a working title for the project, being in a slightly irreverent mood (and a big fan of Monty Python's Flying Circus).
译文:
六年多以前,即1989年12月,我正在寻找一个“业余爱好”编程项目,该项目将使我在圣诞节前后的一周内忙碌起来。我的办公室(由阿姆斯特丹政府运营的研究实验室)将关闭,但我有一台家用计算机,除此之外,手上没有什么其他东西。我决定为我最近考虑的新脚本语言编写一个解释器:衍生自ABC,它将吸引UNIX/C黑客。我选择Python作为该项目的工作名称,是因为当时有点玩世不恭的情绪(并且我是巨蟒剧团之飞行马戏团的忠实拥护者)。
英文Python是大蟒蛇的意思。Python的第一个实现是在Mac机上,Python是从ABC发展起来的,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计)的影响,并且结合了Unix shell和C的习惯。吉多·范罗苏姆曾是C++程序员,之前也参与设计了ABC的教学语言,吉多·范罗苏姆认为,ABC这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,认为是其非开放造成的。他决定在Python中避免这一错误,同时,还想实现在ABC中未曾实现的东西。
1991年,第一个Python编译器诞生,它是用C语言实现的,并能够调用C语言的库文件。从一出生,Python就已经具有了类、函数和异常处理,同时包含表和词典在内的核心数据类型,以及以模块为基础的拓展系统。
Python 2.0于2000年10月16日发布,实现了完整的垃圾回收,并且支持Unicode。同时,整个开发过程更加透明,社群对开发进度的影响逐渐扩大。
Python 3.0于2008年12月3日发布,此版不完全兼容之前的Python源代码。不过,很多新特性后来也被移植到旧的Python 2.6/2.7版本中。
更多Python的发展历史,见表1-1。
表1-1 Python发展历史

1.2.3 Python解释器
用户编写Python代码时,得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器(Interpreter)去执行.py文件。
解释器是一种计算机程序,能够把高端编程语言一条一条地解释运行。比如PHP、JavaScript、Ruby、Perl也是典型的解释性语言。编译器需要把源程序的每一条语句都编译成机器语言,并保存成二进制文件,然后才能运行程序。而解释器则是只在执行程序时,才一条一条地解释成机器语言给计算机来执行。解释器的优点是比较容易让用户实现跨平台的代码,同时不需要编译即可执行代码,缺点是运行速度慢。
下面对几种常用的Python解释器进行简单介绍。
1.CPython
当从Python官方网站下载并安装好Python 3.7.0后,就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。CPython是使用最广的Python解释器,用“>>>”作为提示符。
2.IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。IPython用“In [序号]:”作为提示符。
3.PyPy
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。
绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython是有一些不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点。
4.Jython
Jython(原JPython),是用Java语言编写的Python解释器。Jython运行在Java平台上,可以直接把Python代码编译成Java字节码执行。
5.IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.NET平台上的Python解释器,可以直接把Python代码编译成.NET的字节码。
1.2.4 Python的特点
Python是当前发展最快的主流编程语言之一,Python作为一门高级编程语言,它的诞生虽然很偶然,但是它得到程序员的喜爱却是必然。Python的特点是优雅、明确、简单,对于初学者来说入门容易,将来也很容易深入下去。Python语言具有以下的特点。
1)易于学习:Python关键字相对较少,结构简单,学习起来更加简单。
2)解释型语言:Python是一种解释型语言,源代码可直接运行。
3)面向对象:Python支持除封装以外的所有面向对象编程语言标准特性。
4)丰富的函数库:Python的最大的优势之一是丰富的函数库。
5)跨平台:Python在UNIX、Windows和Macintosh上可以很好地兼容。
6)免费开源:使用者可以免费分发此软件的副本,阅读该软件的源代码,对其进行修改,并在新的免费程序中使用其中的一部分。
7)数据库:Python提供所有主要的商业数据库的接口。
8)GUI编程:Python支持GUI,可以创建和移植到许多其他系统。
9)可扩展性和可嵌入性:可将C/C++程序嵌入到Python中,以提高关键代码的运行速度。
1.2.5 Python 3与Python 2的区别
Python 3.0,也称为“Python 3000”或“Py3K”,为了不带入过多的累赘,是有史以来第一个故意向后兼容的Python版本。与典型版本相比,有许多更改,对所有Python用户而言,这些更改都很重要。本书中的所有示例都基于Python 3.7.0版本。但对于初学者来说还是有必要简单了解Python 3.x与2.x版本的区别。许多针对早期Python版本设计的程序都无法在Python 3.0上正常执行。
为了照顾现有程序,Python 2.6作为一个过渡版本,基本使用了Python 2.x的语法和库,同时考虑了向Python 3.0的迁移,允许使用部分Python 3.0的语法与函数。新的Python程序建议使用Python 3.0版本的语法,除非执行环境无法安装Python 3.0或者程序本身使用了不支持Python 3.0的第三方库。
大多数第三方库都正在努力地兼容Python 3.0版本,即使无法立即使用Python 3.0,也建议编写兼容Python 3.0版本的程序,然后使用Python 2.6、Python 2.7来执行。
Python 3.0的变化主要在以下几个方面。
1.print函数
Python 3.0中print语句没有了,取而代之的是print()函数。Python 2.6与Python 2.7部分地支持这种形式的print语法。在Python 2.6与Python 2.7里面,以下3种形式是等价的。
Python 2.x:

Python 3.x:

2.Unicode
Python 3.0使用text和binary数据代替了Python 2.0中的Unicode字符串类型和字节(8位)字符串类型。所有文本都是Unicode,但编码的Unicode表示为二进制数据。用于保存文本的类型是str,用于保存数据的类型是字节。
由于Python3.x源代码文件默认使用utf-8编码,这就使得以下代码都是合法的。

Python 2.x:

Python 3.x:

3.除法运算
Python中的除法与其他语言相比,有套很复杂的规则。Python中的除法有两个运算符,/和//。
(1)/ 除法
在Python 2.x中 / 除法跟我们熟悉的大多数语言,如Java和C差不多,整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。
在Python 3.x中 / 除法不再这么做了,对于整数之间的相除,结果也会是浮点数。
Python 2.x:

Python 3.x:

(2)// 除法
这种除法叫作floor除法,即向下取整。会对除法的结果自动进行一个floor操作,在Python 2.x和Python 3.x中是一致的。
Python 2.x:

Python 3.x:

4.异常
在Python 3中处理异常也有所改变,其使用as作为关键词。捕获异常的语法由except exc,var改为except exc as var。
如果要捕获多种类别的异常,需要使用语法except (exc1, exc2) as var,可以同时捕获exc1和exc2两种异常。Python 2.6已经支持这两种语法。
如果在Python 3.0中使用如下代码,将是错误的。

正确的写法如下。


5.xrange
在Python 2.0中xrange()函数创建迭代对象,一个生成器。xrange()函数生成一个序列。
在Python 3.0中,range()是和Python 2.0中xrange()那样生成一个迭代对象,xrange()函数则不再存在。
6.八进制和二进制字面值
Python 3.0中八进制数的表示形式是0o777,原来的形式0777不能用了。
Python 3.0中二进制必须写成0b111。同时新增了一个内建函数bin(),用于将一个整数转换成二进制字串。Python 2.6已经支持这两种语法。
Python 2.x:

Python 3.x:

7.不等于运算符
Python 2.x中不等于有两种写法:!=和<>。
Python 3.x中去掉了 <>,只有 != 一种写法。
8.去掉了repr表达式 ``
Python 2.x中反引号``相当于repr函数的作用。
Python 3.x中去掉了反引号``这种写法,只允许使用repr函数,这样做的目的是为了使代码看上去更清晰。
9.多个模块被改名
一些模块被重命名,因为它们的旧名称没有遵守PEP 8规则,或出于各种其他原因。被重命名的模块,见表1-2。
表1-2 Python 3与Python 2相比被重命名的模块
