1.1 Python的历史
1.1.1 Python的诞生
Python是一门高级计算机程序设计语言,1989年,荷兰的Guido von Rossum创造了它。Guido是是一个牛人,1982年,他从阿姆斯特丹大学获得了数学和计算机硕士学位,因此他可以算是一位数学家,不过他更享受使用计算机解决问题的感觉。Python只是由Guido的一次hacking产生的,1989年圣诞节假期,早就萌发了设计一门好用的高级语言的想法的Guido,放弃了休息,全身心的投入到了设计新语言的活动中去,结果产生了世界上少有的几门最优美、最易用、最简洁的高级程序设计语言之一——Python语言。
我们说过,Guido是一个牛人,他在设计Python语言之前,已经接触并使用过Pascal、C、Fortran等高级语言,这些语言各有强大的功能,能够很好地解决问题,Guido也能很熟练地使用它们,他为什么还要"多此一举"地设计一门新语言呢?
这是因为,上述这些语言都是为了充分利用计算设备而设计的,因为那时的计算机CPU不够快,内存不够大,这些语言设计的主要目标之一是充分利用计算机有限的资源,让程序运行得更快,占用的内存空间更小,虽然也把人类的可读性和易用性作为一个目标,但后者仍不够突出,结果人类不能用最简洁的方式去书写计算机程序,写出来的程序既长又不好懂。举个生活中的例子进行类比: 假设初中生、小学生和幼儿园小朋友都解一道数学题:
鸡兔同笼,共有头48个,脚132只,求鸡和兔各有多少只?
初中生解这道题的方法是:
设有鸡x只,兔y只,则 # 对应到计算机编程,这是编写程序代码的部分
x+y=48 # 容易理解,容易编写,简明
2x+4y=132
解这个二元一次方程组,得: # 这是程序运行进行计算的部分
x=30, y=18
小学生解这道题的方法是:
1. 将鸡、兔都剪去2只脚,还剩几只脚: 132-48*2 # 对应到计算机编程,这是编写程序
# 代码的部分,不容易理解
2. 上式计算结果是=36 # 这是程序运行进行计算的部分
3. 剩下的脚是兔子的脚,兔子有几只: 36/2 # 对应到计算机编程,这是编写程序
# 代码的部分,不容易理解
4. 上式计算结果是=18
5. 鸡有多少只: 48-18=30只
幼儿园小朋友解这道数学题时,需要家长手把手地教他们做:
第一步: 48个头中有鸡的头,也有兔子的头
第二步: 132只脚中有鸡的脚,也有兔子的脚
第三步: 每只鸡有2只脚,每只兔子有4只脚
...
很多步之后:
鸡: 30只,兔: 18只
在上面这个例子中,我们可以看到初中生、小学生、幼儿园小朋友之间解同一个数学问题的区别首先是表达方式上的区别,可以把他们类比成Python(初中生)、C/Fortran/Pascal(小学生)、汇编语言(幼儿园小朋友)之间的区别,越是高级的语言,解题方法的表达方式就越简洁、越清晰、越容易理解,所需的解题步骤(代码量)就越少。
Guido创造Python时想解决的是类似的问题,C/Fortran/Pascal甚至汇编语言的能力不可谓不强大,就像一个训练有素的小学生可以解决很多生活中的实际问题一样,但是它们的缺点是需要下达的指令(编写的代码)太多,而且不容易直观地理解。举个例子,常常一行Python代码可以抵得上十几行C语言代码。
先看Python代码
# 代码1.1 printStr.py ,这是Python代码,这段代码和下面的C代码作用相同
s1="Hello,"
s2="World!"
s3=s1+s2
print(s3)
代码1.1 的输出如下所示
$ python3 printStr.py
$ Hello,World!
说明: 本文中的Python代码假定是在类Unix系统下运行的,$是命令提示符
再来看看C代码
// 代码1.2 printStr.c 这是C代码
#include
#include
#include
int strlen(char str[])
{
int len=0;
char *p=0;
for(p=str;p!=NULL;p++){
len++;
}
return len;
}
int main(void){
char s1[]="Hello,";
char s2[]="World!";
char * s3=(char *)malloc(sizeof(char)*(strlen(s1)+strlen(s2)+1));
char *p=0;
for(p=s1;p!=NULL;p++){
*s3++=*p;
}
for(p=s2;p!=NULL;p++){
*s3++=*p;
}
s3='\0';
s3=s3-strlen(s3);
printf("%s\n", s3);
}
代码1.2的输出如下:
$ gcc printStr.c -o printStr
$ ./printStr
$ Hello,World!
代码1.1和代码1.2完成的是相同的功能,在C语言中使用了29行代码实现,而且代码的含义并不直观,反观Python代码,它只用了4行代码,简洁明快,容易理解,而代码量非常少,这就是Guido Von Rossum想要实现的效果。
1.1.2 Python的主要版本
Python历史上经历了0.X、1.X、2.X和3.X等4个大的主要版本,其中的X表示小版本号,比如Python2就有2.0、2.4、2.5、2.6、2.7等版本。Python的主要版本诞生时间如表1.1所示。现在世界上应用的Python程序,使用的主要是Python 2.X和Python 3.X版本,使用这两种Python大版本的应用程序是并存的,但Python 2和Python 3并不兼容,这是由于在开发Python 2时,计算机世界的很多新技术还未出现,Python 3提供了对这些新技术的支持,因此其不与Python 2 兼容。Python 2 将在 2020年停止支持,不再进行开发。今后应该主要学习和使用Python 3。不过,由于Python 2和Python 3的设计理念是相同的,而且大部分内容也相同,因此,从Python2开始学习也可以平滑地转换到Python 3上。
Python版本号 | 诞生时间 |
---|---|
世界上首个Python版本 | 1989年圣诞节 |
第一个公开发行的Python版本 | 1991年 |
Python 1.0 | 1994-01 |
Python 2.0 | 2000-10-16 |
Python 2.4 | 2004-11-30 |
Python 2.5 | 2006-09-19 |
Python 2.6 | 2008-10-01 |
Python 2.7 | 2010-07-03 |
Python 3.0 | 2008-12-03 |
Python 3.1 | 2009-06-27 |
Python 3.2 | 2011-02-20 |
Python 3.3 | 2012-09-29 |
Python 3.4 | 2014-03-16 |
Python 3.5 | 2015-09-13 |
Python 3.6 | 2016-12-23 |
1.2 Python是一种解释型(脚本)语言
编程语言可以分成解释型和编译型两种。实际上,对于高级语言来说,我们编写的代码都是为了更好地完成计算任务及让人们更好的编写和理解代码而设计给人们使用的,因此编写代码这个步骤是面向人类的,也就是人类可读写的。另一方面,还需要让计算机理解和运行程序,而计算机只理解0/1组成的代码,它并不能直接运行人们编写的高级语言代码。如何解决这个问题呢?这就需要高级语言的解释器或编译器大显身手了,这两个东西都是将高级计算机语言翻译成机器可执行的代码的工具。显然,使用解释器的就是解释型语言,使用编译器的就是编译型语言了。二者的区别是解释型语言运行时,形式上是直接运行高级语言代码,解释器在后台逐条对高级语言代码进行解释运行,多次运行需要多次解释;而编译型语言的高级语言代码一旦编写除错完成,就使用编译器对代码进行一次性地编译,翻译成机器可以执行的代码,供以后反复运行,一次编译可以多次运行。编译型语言的一个著名的例子就是C语言。
由于解释型语言运行时,同时要进行解释和运行的任务,而编译型语言的编译过程提前完成了,所以解释型语言通常比编译型语言的程序运行速度慢,而且慢得多。
解释型语言由于直接运行高级语言代码,像电影脚本那样,按照文件预定的步骤,一步一步完成处理任务,所以也称为脚本语言。
Python是一种解释型(脚本)语言。它自从创生以来就风靡了世界,取得了很大的成功。为什么Python运行速度慢,还能做到这样的成功呢? 这就要从它的特点说起了。
1.3 Python的特点
1.3.1 Python代码易读、易写、易懂、易调、易改
Python的设计理念是"优雅、简明、高效",我们在前面所举的例子代码1.1中可以充分地看到上述这一特点。由于Python是一种解释型语言的特点,执行它不需要对其进行编译,代码执行过程中发现了问题,可以直接修改代码进行调试,而Python解释器提供的错误排查机制,增强了调试除错的功能,因此实际使用Python时感觉十分流畅,这种体验非常容易让人上瘾。
1.3.2 Python功能强大、易扩展、有丰富的专业库
另外,一方面Python好像是一个工具箱,官方Python语言及其标准库就自带很多好用的工具,如它的字符串处理能力,如列表、元组、字典等数据结构,如列表解析、函数的可变参数传递和多值返回、如动态数据类型和自动垃圾回收机制等内容。
同时,其他组织和个人还可以为Python开发实现某项通用功能的软件库,通过"第三方"扩展模块的方式为Python提供"扩展的工具箱"。
由于Python本身十分强大,并且存在丰富的软件库,每个想要实现某种特定任务的人,都可以找到合适的软件包进行工作,而且由于软件包常常十分强大,非常适合新手完成用其他语言很难完成的任务,用句俗话说 ,就是非常容易上手。
进一步说,Python用户还可以在Python官方语言和丰富的第三方库的基础上自定义自己的"实用工具",来增加自己可用的工具。因此,可以说Python具有灵活的扩展性,在各个行业领域都具有丰富的软件库可供使用。Python非常适用于具有各种专业背景的人士编写计算机程序完成专业领域的运算任务。
表1.2列出了一些酷炫的Python软件库:
软件库 | 功能 |
---|---|
NLTK | 人类语言处理 |
jieba | 中文分词工具 |
SnowNLP | 一个处理中文文本的库 |
pyocr | 光学字符识别(把扫描的文字图像转换成字符串) |
moviepy | 一个用来进行基于脚本的视频编辑模块,适用于多种格式,包括动图 GIFs |
GeoDjango | 世界级地理图形 web 框架 |
django-shop | 一个基于 Django 的店铺系统 |
Cartridge | 一个基于 Mezzanine 构建的购物车应用 |
newspaper | 使用 Python 进行新闻提取,文章提取以及内容策展 |
PyCrypto | Python 密码学工具箱 |
Tkinter | Tkinter 是 Python GUI 的一个事实标准库 |
Panda3D | 由迪士尼开发的 3D 游戏引擎,并由卡内基梅隆娱乐技术中心负责维护。使用C++编写, 针对 Python 进行了完全的封装 |
PyOgre | Ogre 3D 渲染引擎的 Python 绑定,可以用来开发游戏和仿真程序等任何 3D 应用 |
astropy | 一个天文学 Python 库 |
bccb | 生物分析相关代码集合 |
Neupy | 执行和测试各种不同的人工神经网络算法 |
NumPy | 使用 Python 进行科学计算的基础包 |
ino | 操作Arduino的命令行工具 |
Pyro | Python 机器人编程库 |
1.3.3 Python代码简明,书写效率高
Python语言本身设计得简明而高效,而且由于各种强大的Python软件库的存在,它们已封装了各种强大的功能,引入了这些库之后,实现专业领域的复杂任务常常只需数行甚至一行核心代码就可解决问题,因此,Python代码常常非常简明,而且书写效率相当高,这一点,在前面的代码1-1已经见识到了。