每台计算机都有自己的指令(instruction)集合,每条指令可以让计算机完成一个最基本的操作。程序(program)则由一系列指令根据特定规则组合而成,在计算机上执行程序的过程实质上就是组成程序的各条指令按顺序依次执行的过程。
从根本上说,计算机是由数字电路组成的运算机器,只能对数字做运算(包括算术运算和逻辑运算)。程序之所以能处理声音、文本、图像、视频等数据,是因为这些数据在计算机内部也是用数字表示的。这些数字经过专门的硬件设备转换成人们可以听到的声音或可以看到的文本、图像和视频。
对于程序来说,其功能通常可以抽象为图1-1所示的形式,包括输入(input)数据、输出(output)数据和数据处理(data processing)。
图1-1 程序功能
• 输入数据:从键盘、文件或者其他设备获取待处理的数据。
• 输出数据:把处理后的结果数据输出到屏幕、文件或其他设备。
• 数据处理:对输入数据进行各种运算,得到输出结果。
程序设计语言可以分为高级程序设计语言和低级程序设计语言:高级程序设计语言包括Python、C/C++、Java等,低级程序设计语言包括汇编语言和机器语言。假设有这样一个功能:将b与1的加法运算结果赋给a。表1-1分别展示了Python语言、汇编语言和机器语言对该功能的不同实现方式。
表1-2 Python部分版本的信息
通过表1-1可以看到,在编写程序的难易程度上,机器语言最困难,因为需要记住大量二进制命令;其次是汇编语言,可以用一些助记符代替二进制命令,但仍然需要逐条编写指令;高级程序设计语言最容易,可通过我们习惯的方式来实现相应运算。另外,由于不同系统所使用的指令集有所不同,所以使用一个系统上的指令集编写的低级语言程序,在另一个具有不同指令集的系统上无法正常运行,即低级语言编写的程序不具有跨平台性。高级程序设计语言由于具有简单易用、跨平台性强等优点,目前已被广泛使用。
提示 在计算机中,任何数据都是采用二进制方式进行表示和存储的,即计算机中的数据都是由0和1组成的。位(bit)是计算机中最小的数据单位,一个二进制位就是一个位,简记为b。字节(Byte)是计算机中存储数据的最小单位,一个字节包含8个二进制位,简记为B。除了字节外,还有更大的数据单位,如KB、MB、GB、TB、PB等,低一级单位到高一级单位的换算关系是2 10 (等于1024),即
1KB=2 10 B,1MB=2 10 KB,1GB=2 10 MB,1TB=2 10 GB,1PB=2 10 TB
通常要用很长的二进制数才能表示一个数据,为了书写简便,实际中可以使用二进制的压缩表示形式——十六进制,如表1-1中机器语言第一条语句中的a1就是一个十六进制数,其对应的二进制数是10100001。关于计算机中的常用数制及各数制之间的转换方法,读者可参阅其他资料。
使用高级程序设计语言编写程序,虽然简化了程序编写工作,但这些程序对于计算机来说无法理解。因此,使用高级程序设计语言编写的程序必须先被翻译为计算机能够理解的机器语言程序,才能够在计算机上运行。把高级语言翻译为机器语言的方式有两种:一种是编译,另一种是解释。下面分别进行介绍。
1.编译
高级语言编写的程序称为源代码(source code)或源文件。编译(compile)是将源代码全部翻译成机器指令,再加上一些描述信息,生成一个新的文件。这个新的文件称为可执行文件,可以直接在特定的操作系统上加载运行。一个可执行文件可以在计算机上多次运行,因此,在不修改源代码的情况下,只需要做一次编译即可。编译型语言的编译执行过程如图1-2所示。
图1-2 编译型语言的编译执行过程
2.解释
解释(interpret)是在程序运行时对源代码进行逐条语句的翻译并运行。解释型语言编写的程序每执行一次,就要被翻译一次,翻译结果不会像编译型语言一样保存在可执行文件中,因此效率较低。解释型语言的解释执行过程如图1-3所示。
图1-3 解释型语言的解释执行过程
提示 Python是一种解释型语言,但为了提高运行效率,Python程序在执行一次之后会自动生成扩展名为.pyc的字节码文件(主程序文件不会生成字节码文件,只有调用的模块文件才会生成字节码文件,这一点将在后面章节中举例说明)。下次再运行同一个Python程序时,只要源代码没有做过修改,Python就会直接将字节码文件翻译成机器语言再执行。
字节码不同于机器语言,但很容易转换为机器语言,所以直接翻译字节码而不是去翻译源代码会大大提高Python程序的运行效率。
Python语言于20世纪90年代初由荷兰CWI(Centrum Wiskunde&Informatica,国家数学与计算机科学研究中心)的Guido van Rossum基于C语言开发,作为一种称为ABC语言的替代品。在Python语言的开发过程中,虽然也有其他开发者做了许多贡献,但Guido被认为是Python语言的主要作者。之所以选择Python(“蟒蛇”的意思)作为该编程语言的名字,是因为Guido是室内情景幽默剧 Monty Python's Flying Circus 的忠实观众。
1995年,Guido在美国弗吉尼亚州雷斯顿的CNRI(Corporation for National Research Initiatives,美国国家研究计划公司)继续他的Python语言开发工作,并发布了Python语言的几个版本。
2000年5月,Guido和Python语言的核心开发团队转移到BeOpen.com,组建了BeOpen PythonLabs团队。同年10月,PythonLabs团队转移到Digital Creations(现为Zope公司)。2001年,Python软件基金会(PSF,请参阅https://www.python.org/psf/)成立,这是一个专门为拥有与Python相关的知识产权而创建的非营利组织。Zope公司是PSF的赞助商之一。
Python所有版本都是开源的,从历史上看,大多数(但不是全部)Python版本也与GNU GPL(General Public License,通用公共许可证)兼容。表1-2总结了Python部分版本的信息。
表1-2 Python部分版本的信息
提示 目前使用的Python版本主要有Python 2.x和Python 3.x两种。Python 3.x并不完全兼容Python 2.x的语法,因此,在Python 2.x环境中编写的程序不一定能在Python 3.x环境中正常运行。本书的所有程序均在Python 3.x环境中运行。
GPL兼容许可并不是说在GPL许可下发布Python。与GPL许可不同,所有Python许可允许用户在不公开其修改代码的基础上发布一个修改后的版本。GPL兼容许可使得Python可以与其他GPL许可下发布的软件相结合。
1.特点
(1)优点
• 简单易学:在开发者社群流传着一句玩笑话——“人生苦短,我用Python”。这句话实际上并非完全是戏言,Python是一种代表简单主义思想的语言,可以使用尽量少的代码完成更多工作。它使开发者能够专注于解决问题而不是去搞明白语言本身。另外,Python有极其简单的说明文档,使得初学者很容易上手。
• 免费开源:FLOSS(Free/Libre and Open Source Software)的中文含义是自由、开源软件,其已被证实为当今最好的开放、合作、国际化产品和开发样例之一,已经为政府、企业、学术研究团体和开源领域机构等带来了巨大的利益。Python是FLOSS,使用者可以自由地发布这个软件的副本,阅读它的源代码,对它做改动,把它的一部分用于新的自由软件中。
• 可跨平台:由于Python的开源本质,它已经被移植到许多平台,在Linux、Windows、Macintosh、Android等平台上都可以运行Python编写的程序。
• 属于高层语言:与C/C++语言不同,使用Python语言编写程序时无须考虑诸如“如何管理程序使用的内存”一类的底层细节,从而使得开发者可以在忽略底层细节的情况下,专注于如何使用Python语言解决问题。
• 支持面向对象:Python既支持面向过程的编程,也支持面向对象的编程。面向过程的编程方法是对要解决的问题进行逐层分解,对每个分解后的子问题分别求解,最后再将各子问题的求解结果按规则合并以形成原始问题的解。面向对象的编程方法是模仿人类认识客观世界的方式,将软件系统看成由多类对象组成,通过不断创建对象并实现对象之间的交互来完成软件系统的运转。因此,面向对象的编程方法目前已被广泛使用。但需要注意,面向对象和面向过程并不是完全独立的两种编程方法,当使用面向对象方法设计和编写程序时,对于其中涉及的复杂问题也需要采用面向过程的方法,通过“层层分解,逐步求精”的方式分步骤解决。
• 库资源丰富:Python官方提供了非常完善的标准代码库,它可以帮助处理各种工作,包括网络编程、输入/输出、文件系统、图形处理、数据库、文本处理等。除了内置库,开源社区和独立开发者为Python贡献了丰富的第三方库,如用于科学计算的NumPy、用于Web开发的Django、用于网页爬虫的Scrapy和用于图像处理的OpenCV,等等,其数量远超其他主流编程语言。代码库相当于已经编写完成并打包供开发者使用的代码集合,程序员只需通过加载、调用等操作手段即可实现对库中函数、功能的使用,从而省去了自己编写大量代码的过程,让编程工作看起来更像是在“搭积木”。
• 胶水语言:Python本身被设计成具有可扩展性,它提供了丰富的API和工具,以便开发者能够轻松使用C、C++等主流编程语言编写的模块来扩充程序。例如,如果要使一段关键代码运行得更快或者希望某些算法不公开,可以将部分程序用C或C++编写,然后在Python程序中使用它们。Python就像胶水一样把用其他编程语言编写的模块黏合过来,让整个程序同时兼备其他语言的优点,起到了黏合剂的作用。正是这种“胶水”的角色让Python近些年在开发者团体中声名鹊起,因为互联网与移动互联时代的需求量急速倍增,大量开发者亟须一种极速、敏捷的工具来帮助其处理与日俱增的工作,Python发展至今的形态正好满足了这种需求。
(2)缺点
• 单行语句:与C/C++语言不同,Python语句的末尾不需要写分号,所以一行只能有一条语句,而无法将多条语句放在同一行中书写,如“import sys;for i in sys.path:print i”这种写法是错误的。而Perl和Awk就无此限制,可以较为方便地在Shell下完成简单程序,不需要如Python一样,必须将程序写入一个.py文件。
• 强制缩进:Python用缩进方式来区分语句之间的关系,给许多用过C/C++或Java的开发者带来了困惑。但如果习惯了这种强制缩进的写法,开发者就会觉得它非常优雅,能够清晰地体现出各语句的层次关系。
• 运行速度慢:由于Python是解释型语言,所以它的运行速度会比C/C++慢一些,对一些实时性要求比较强的程序会有一些影响。但如前所述,Python是一种“胶水语言”,能够非常方便地使用C/C++编写的模块,所以对于速度要求比较高的关键运算模块,可以使用C/C++语言编写。
2.应用领域
• 系统编程:Python提供API(Application Programming Interface,应用程序编程接口),能方便地进行系统维护和管理,是Linux下标志性语言之一,也是很多系统管理员理想的编程工具。
• 图形界面开发:Python在图形界面开发上很强大,可以用Tkinter/PyQt框架开发各种桌面软件。
• 科学计算:Python是一门很适合做科学计算的编程语言。从1997年开始,NASA就大量使用Python进行各种复杂的科学运算,随着NumPy、SciPy、Matplotlib、Enthought librarys等众多程序库的开发,Python越来越适合做科学计算并绘制高质量的二维和三维图像。
• 文本处理:Python提供的re模块能支持正则表达式,还提供SGML、XML分析模块,许多程序员利用Python进行XML程序的开发。
• 数据库编程:程序员可通过遵循Python DB-API(数据库应用程序编程接口)规范的模块与Microsoft SQL Server、Oracle、Sybase、DB2、MySQL、SQLite等数据库通信。另外,Python自带一个Gadfly模块,提供了完整的SQL环境。
• 网络编程:Python提供丰富的模块以支持Sockets编程,能方便、快速地开发分布式应用程序。
• Web开发:Python拥有很多免费数据函数库、免费网页模板系统以及与Web服务器进行交互的库,可以实现Web开发,搭建Web框架。目前流行的Python Web框架是Django, Django官方把Django定义为“the web framework for perfectionists with deadlines”(完美主义者使用的高效率Web框架)。用Python开发的Web项目小而精,支持最新的XML技术,而且数据处理的功能较为强大。
• 自动化运维:Python是运维人员广泛使用的语言,能满足绝大部分自动化运维需求,包括前端和后端。
• 金融分析:利用NumPy、Pandas、SciPy等数据分析模块,可快速完成金融分析工作。目前,Python是金融分析、量化交易领域里使用最多的语言。
• 多媒体应用:Python的PyOpenGL模块封装了OpenGL应用程序编程接口,能进行二维和三维图像处理。
• 游戏开发:在网络游戏开发中Python也有很多应用。相比Lua,Python有更高阶的抽象能力,可以用更少的代码描述游戏业务逻辑。另外,Python更适合作为一种Host语言,即将程序的入口点设置在Python那一端会比较好,然后用C/C++写一些扩展程序。Python非常适合编写规模在1万行以上的项目,而且能够很好地把网游项目的规模控制在10万行代码以内。
• 人工智能:NASA和Google早期大量使用Python,为Python积累了丰富的科学运算库。当AI(Artificial Intelligence,人工智能)时代来临后,Python从众多编程语言中脱颖而出,各种AI算法都基于Python编写。在神经网络、深度学习方面,Python都能够找到比较成熟的包来加以调用。另外,Python是面向对象的动态语言,且适用于科学计算,这就使得Python在人工智能领域备受青睐。
• 网络爬虫:在爬虫领域,Python几乎处于霸主地位,提供了Scrapy、Request、BeautifulSoup、urllib等工具库,将网络中的一切数据作为资源,通过自动化程序进行有针对性的数据采集和处理。
使用Python语言编写程序来实现一个非常简单的功能。例如,使用Python爬取指定网页上的数据,只需要几行代码即可实现,如下面的代码所示。
【思考题1-1】 ( )是计算机完成的最基本的操作。
A.程序
B.指令
C.代码
D.命令
【思考题1-2】 Python脚本文件作为模块使用时,在执行一次之后会自动生成扩展名为( )的字节码文件,以提高运行效率。
A..py
B..pyc
C..pyb
D..pyf