1.1 Python综述
Python是一种可以撰写跨平台应用程序的面向对象程序设计语言,它具有卓越的通用性、高效性、平台移植性和安全性,被广泛应用于Web、PC、商业分析等领域,同时在全球范围内拥有众多开发者社群。
1.1.1 了解Python的特性及版本
1. Python的历史及特点
Guido Van Rossum于1989年底首创Python,当时他还在荷兰的CWI(Centrum voor Wiskunde en Informatica,国家数学和计算机科学研究院)工作。1991年初,Python发布了第1个公开发行版。至2021年,Python已经流行并发展了30年,在各个领域都有着广泛的应用,究其原因,Python的流行归结于以下几个方面。
• 解释性语言:解释性语言的程序不需要开发者进行编译,在运行程序时才被翻译成机器代码。脚本语言解释执行的特点是“随时编辑、随时生效”。计算机硬件愈发廉价,间接使得在多数商务应用中软件的运行效率不再是选择开发语言的首要标准。而企业也逐步意识到开发效率和可移植性的重要性,这使得脚本语言在软件项目中扮演着越来越重要的角色。
• 高级性:Python的高级性不是相对于汇编语言而言的,而是相对于C++、Java等高级语言而言的。Python在语言层面对开发者提供了更强大的支持。任何具有规模的应用程序都需要用到链表、字典等数据结构,在Python中,List、Set、Dict等是内建于语言本身的。在核心语言中提供这些重要的构建单元,可以鼓励人们使用它们,缩短开发时间,减少代码量,生产出可读性更好的代码。而在C++等语言中,这些需要通过附加的标准库来实现。
• 胶水语言(glue language):即使读者从未学习过Python,可能也知道Python是最主要的胶水语言之一。胶水语言是用来连接软件组件的程序设计语言,这意味着Python就像一只八爪章鱼,可以连接各种主要的技术标准,比如Shell Command、Windows DLL和Web Service。在B/S应用大行其道的时代,曾经出现过几十个Python Web开发框架,发展到现在已经形成了Django、Tornado等成熟的解决方案。
• 跨平台性:Windows、Linux、macOS等操作系统的优劣之争由来已久,但这是一个永无止境的话题。目前已形成的共识可以归结为:Windows客户端简单易用,Linux操作系统胜在稳定性,macOS操作系统提供了更好的用户体验。Python在各平台上都实现了编译解释器,使得Python程序可以运行在不同的操作系统平台上。
• 健壮性:所谓健壮的系统是指对于规范要求以外的输入能够判断出这个输入不符合规范要求,并有合理的处理方式。一个软件能够检测自己内部的设计或者编码错误,并得到正确的执行结果,这是软件的正确性标准,但也可以说,软件有内部的保护机制,是模块级健壮的。Python的强类型机制、异常处理、垃圾的自动收集等是其程序健壮性的重要保证。使用Python的开发者不用在资源申请、回收等方面花费太多精力。
• 易学易用:Python的设计哲学是“优雅”“明确”“简单”。由于Python的简洁、易读及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python教授程序设计课程,如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用Python讲授。众多开源的科学计算软件包都提供了Python的调用接口,如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。当然,在本书的主题Web领域,Python目前涌现了众多框架,最具代表性的就是本书将要讲解的Django、Tornado、Flask和Twisted。
说明:Python是一种解释性语言,虽然属于开源项目,但我们可以将其用于商业用途,并且可以将其放在用于商业用途的产品光盘中一同发售。
2. Python的当前版本
经过长时间的发展,Python同时流行两个不同的版本,它们分别是2.x和3.x版本,但是与其他语言不同的是,这两个主要版本之间无法实现兼容。
本书第1版发行时,Python 2还是大多数应用的主流版本,包括本书详细介绍的Twisted等框架都未发布基于Python 3的稳定版本。但是到了2018年本书第2版发行时,多数Python项目都选择了Python 3,所有主流框架也都完成了基于Python 3的稳定版本的发布。
而本书确定更新第3版时,Python 2已经退出历史舞台,Python 3是Python初学者的必然选择。因此,本书全部基于Python 3进行讲解与实践。
注意:本书中的程序都是基于Python 3.8介绍的。截止到本书写作时,虽然已经有Python 3.9,但还不够完善。
1.1.2 安装Python
只有在操作系统中安装了Python环境之后,Python程序才能运行。Python安装包可以去Python官方网站下载,如图1.1所示。
注意:虽然这里已经是Python 3.9.1,但当我们选择Windows版本下载时,最近一次的发行版本依然是3.8.x。
图1.1 Python安装包下载
1. 在Windows 10上的安装
Python的Windows安装包以python-x.x.x.exe或python-x.x.x.amd64.exe方式命名,其中x.x.x是所下载的版本号。直接运行该程序可以进入Python的安装界面,如图1.2所示。
确保对话框下方的“Add Python x.x to PATH”复选框已勾选,然后单击“Install Now”按钮继续安装,Python在Windows中的安装过程如图1.3所示。
图1.2 Python在Windows中的安装界面
图1.3 Python在Windows中的安装过程
安装完成后,Python 3的可执行程序路径就会被自动加入Windows环境变量中。可以通过环境变量对话框查看,具体查找路径为:【计算机】|【属性】|【高级系统设置】|【环境变量】对话框中的【Path】变量,如图1.4所示。
图1.4 在Windows中设置PATH环境变量
在操作系统中安装了Python后就可以手动运行Python程序了,比如,通过如下命令运行一个Python文件:
说明:Python代码文件一般以*.py命名。
或者可以在Console(命令行窗口)中直接运行Python命令,以进入Python环境,如图1.5所示。图1.5中的“>>>”是Python命令提示符,在其后可以输入任意Python命令。
图1.5 在Windows中启动Python环境
2. 在Linux与macOS上的安装
较新的Linux与macOS系统都自带了Python 3的解释器。对于Linux来说,如果需要单独安装,可以利用这些系统上的软件包管理器,通过简单的命令完成Python 3的安装,如对于Ubuntu来说:
对于macOS系统,可以从Python官网下载pkg安装包用图形化方式安装。
它们的安装都较简单,唯一需要注意的是,在这些系统中如果同时安装了Python 2和Python 3,建议用“python3”命令执行Python程序:
这样做的原因是,在这些系统中,“python”命令往往指向系统自带的Python 2解释器。当然,也可以用更加明确的带小版本号的命令:
1.1.3 使用Python原生编辑器
IDLE是Python软件包自带的一个集成开发环境,初学者可以利用它方便地创建、运行、测试和调试Python程序。在安装Python后,开发者可以通过【Windows开始】|【Python x.x】|【IDLE】直接运行,IDLE的界面如图1.6所示。
图1.6 IDLE的界面
图1.6中已经完成了一个“Hello World”的演示。通过IDLE,开发者可以快速进入Python环境,除了学习,有经验的开发者还可以用IDLE进行快速验证、测试等工作。作为一个编辑器,IDLE环境提供了如下功能。
• 一个多窗口环境,提供自动完成、自动缩进等基于Python的编辑功能。
• 语义解析、关键字高亮。
• 提供单步调试、断点、调用栈视图等功能。
常用的编辑方式如下。
• Undo:撤销上一次的修改。
• Redo:重复上一次的修改。
• Cut:将所选文本剪切至剪贴板。
• Copy:将所选文本复制到剪贴板。
• Paste:将剪贴板上的文本粘贴到光标所在的位置。
• Find:在窗口中查找单词或模式。
• Find in Files:在指定的文件中查找单词或模式。
• Replace:替换单词或模式。
• Go to Line:将光标定位到指定的行首。
技巧:Python可以记录会话期间在命令行中执行过的所有命令。在提示符下,可以按Alt+P组合键找回这些命令,每按一次,IDLE就会从最近的命令开始检索命令历史,按命令使用的顺序逐个显示。按Alt+N组合键,则可以反方向遍历各个命令,即从最初的命令开始遍历。
通过菜单【Debug】|【Debugger】可以打开“Debug Control”窗口,在IDLE中输入Python语句后,可以通过调试对话框中的4个控制按钮Go(执行)、Step(单步)、Over(单行执行)、Out(跳出函数)进行调试。在IDLE中调试Python语句如图1.7所示。
图1.7 在IDLE中调试Python语句
1.1.4 使用Eclipse开发环境
虽然Python自带的IDLE环境提供了简单的编辑和调试Python程序的方法,但其功能简单,无法满足企业级项目开发的需求。
Python程序本身可以用任何文本编辑器来编写,从Windows记事本、Notepad++、UltraEdit,到Linux的VIM、EMACS等,有经验的开发者可以根据自己的习惯进行选择。但因为初学者可能缺少开发经验并熟悉Windows平台的操作,所以本书为初学者推荐一个成熟度较高的开发环境——Eclipse。使用Eclipse的PyDev插件可以搭建可视化、控制灵活、调试方法完备的Python专业开发环境。
1. 安装Eclipse
Eclipse是一个在Windows环境下开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,通过插件构建开发环境。读者可以通过Eclipse官方网站下载适合自己操作系统的最新版本Eclipse软件包。Eclipse的启动界面如图1.8所示。
图1.8 Eclipse的启动界面
注意:在安装Eclipse之前,必须先安装Java开发套件JDK。
首次启动Eclipse时会询问开发者项目的默认路径,确认则勾选“Use this as the default and do not ask again”复选框,然后单击“Launch”按钮即可,如图1.9所示。
图1.9 Eclipse项目默认路径设置
2. 安装PyDev插件
PyDev是Python在Eclipse中的环境插件,需要在Eclipse启动后进行安装。
(1)单击【Help】|【Install New Software】菜单,在出现的界面中单击“Add…”按钮,在Add Repository对话框的“Name”栏中填写PyDev,在“Location”栏中填写“http://www.pydev.org/updates”,之后单击“Add”按钮,如图1.10所示。
图1.10 在Eclipse中搜索PyDev
(2)Eclipse会在线搜索PyDev并列出可安装的包,开发者需要选择“PyDev”,然后单击Install窗口中的“Next>”按钮,如图1.11所示。
图1.11 在Eclipse中安装PyDev
(3)按照提示完成条目及协议确认,逐步完成安装即可。在安装过程中,Eclipse会自动从Internet下载安装包并安装,需要耐心等待。
(4)安装完成后,需要重启Eclipse才能使PyDev生效。
在进行Python开发之前,需要在Eclipse中先配置Python解释器的路径,方法为:选择【Window】|【Preferences】菜单,在出现的对话框中选择【PyDev】|【Interpreters】|【Python Interpreter】,单击对话框中的“Browse for python/pypy.exe”按钮,在出现的对话框中将“Interpreter Name”设置为Python 3,在“Interpreter Executable”栏为所安装的Python可执行程序输入完整路径名,如“C:\xxx\Python38\python.exe”。Python解释器的配置如图1.12所示。
图1.12 Python解释器的配置
确认后会出现如图1.13所示的pythonpath配置对话框。
单击“OK”按钮后按照提示完成配置即可,不再赘述。至此Python环境已经在Eclipse中安装完成。
图1.13 pythonpath配置
3. 用PyDev新建项目进行Python开发
可以通过在Eclipse中建立PyDev项目来进行Python项目开发。新建PyDev项目的方法如下。
(1)在Eclipse中选择【File】|【New】|【Project…】菜单,在弹出的对话框中选择【PyDev】|【PyDev Project】,并单击“Next >”按钮,如图1.14所示。
图1.14 选择Eclipse的项目类型
(2)在弹出的PyDev项目对话框中输入项目的名字,其他选项可保持默认,单击“Finish”按钮,如图1.15所示。
图1.15 新建PyDev项目
至此,已经可以使用Eclipse的强大功能进行Python开发了。
1.1.5 Python编程入门——解决“斐波那契数列”问题
在1.1.3节中,读者应该已经完成了对Python“Hello World”程序的编写。在本节中,通过解决一个被称为“斐波那契数列”的数学问题,读者可以对Python编程方法有一个初步了解。
斐波那契数列(Fibonacci Sequence)又被称为黄金分割数列,因数学家列昂纳多•斐波那契以兔子繁殖为例子而引入,故又被称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34……在数学上,斐波那契数列以递归的方法定义:F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)。简单地归结斐波那契数列的规律为:第1个数值为0,第2个数值为1,之后的每个数值都是位于它之前的两个数值的和。
【示例1-1】如下Python代码用于每隔一秒打印一个斐波那契数列数字,并且将数列保存到指定的文件中:
代码解析如下。
• 一般情况下,在Python中用“#”标识注释行,但有两种特殊情况:
◦ 当Python代码作为可执行文件直接运行在Linux系统中时,“#!/usr/bin/env python”用于告诉系统Python解释器的位置。
◦ “ # -*- coding: utf-8 -*-”用于标识本文件用UTF-8格式编码,虽然Python 3本身默认使用UTF-8编码,但该项声明对某些编辑器来说仍然有用。
• import语句用于导入包。本例中导入了time包,因为之后的sleep()函数位于其中。
• Python中的函数定义用def关键字完成,“:”用于代码块。代码块通过缩进对齐而不用大括号来表达代码逻辑,因为没有了额外的字符,程序的可读性更高,而且缩进完全能够清楚地表达一个语句属于哪个代码块。本例中定义了两个函数:fbis()和main()。
注意:Python用缩进标识代码块,因此一个代码块内的每行代码的前导空格必须一致,否则执行时解释器会报错。
• 函数参数无须定义类型,如本例中函数fbis()的参数num。
• list是Python中常用的列表类型,Python中的list类型用中括号“[ ]”定义。本例中fbis()函数的result变量是list的实例,用于保存被生成的数列。
• range(num)函数用于生成从0到num-1的数字序列。
• [for … in …]语句是循环流程语句。在函数fbis()的for语句中,生成一个从0到num-2-1的循环,每个循环体中计算一个数值并加入result列表。
• 列表变量的负数索引用于获取列表中倒数的元素,如本例中的result[-1]意为获取result的倒数第1个元素。
• main()函数中用参数10调用fbis()函数,生成10个斐波那契数字。
• Python的内置函数open()用于打开文件,其第1个参数是被打开的文件名,第2个参数是打开的方式,“w+”表示打开待写入的文件。main()函数将打开的文件句柄放在fobj变量中。
• enumerate()函数会将数组或列表组成一个索引序列,其返回值内包含两个变量的迭代器,第1个是序列号,第2个是数组或列表中本来就有的元素。
技巧:用enumerate生成带索引的迭代序列。
• 在Python中可以使用print()函数打印输出,可以用print显示变量的字符串表示,或者仅使用变量名查看该变量的原始值。Python的print()函数与字符串格式运算符(%)结合使用,可实现字符串替换功能,这一点和C语言中的printf()函数非常相似。
注意:格式运算符(%)后面有多个被替换变量时一定要放在小括号内。
• 用文件句柄的write()函数可以向文件写入数据。文件句柄的read()函数可以从文件中读取数据。
技巧:用open()函数打开文件,用write()函数向文件写入数据,用read()函数从文件中读出数据。
• 用time包的sleep()函数可以让程序暂停一段时间,本例中输入参数1以指定暂停1秒。
• 与其他高级语言一样,判断逻辑用if语句表达。本例中的if语句用于判断代码是被其他模块导入还是直接被执行,如果直接被执行,则调用main()函数。
• __name__是Python的只读内置变量。在模块中访问该变量时,随着模块的调用方式的不同,它有不同的值:当该模块被直接调用时,__name__的值为__main__;当该模块被其他模块用import语句调用时,它的值为当前模块名。
技巧:用本例中的if __name__== '__main__': main()的方法启动main()函数是Python的常用方法。在Python中,所有内置变量都以“前带两个下画线、后带两个下画线”的方式命名。另一个常用的内置变量是__class__,在类内部使用时其内容为当前类名。
将代码文件保存为1-1.py文件,无须编译程序,直接用python命令执行程序,如图1.16所示。
图1.16 执行斐波那契数列程序的结果