Python指南前言Copyright©2001,2002,2003PythonSoftwareFoundation.Allrightsreserved.Copyright©2000BeOpen.com.Allrightsreserved.Copyright©1995-2000CorporationforNationalResearchInitiatives.Allrightsreserved.Copyright©1991-1995StichtingMathematischCentrum.Allrightsreserved.Seetheendofthisdocumentforcompletelicenseandpermissionsinformation.概要Python是一种容易学习的强大语言。它包括了高效的高级数据结构,提供了一个简单但很有有效的方式以便进行面向对象编程。Python优雅的语法,动态数据类型,以及它的解释器,使其成为了大多数平台上应用于各领域理想的脚本语言以及开发环境。Python解释器及其扩展标准库的源码和编译版本可以从Python的Web站点及其所有镜像站上免费获得,并且可以自由发布。该站点上也提供了Python的一些第三方模块,程序,工具,以及附加的文档。Python的解释器很容易通过C或C++(或者其它可以由C来调用的语言)来实现功能和数据结构的扩展。因些,Python也很适于作为定制应用的一种扩展语言。这个手册介绍了一些Python语言及其系统的基本知识与根念。这有助于对Python有一个基本的认识,当然所有的例子都包括在里面了,所以这本手册很适合离线阅读。需要有关标准对象和模块的详细介绍的话,请查询Python程序库参考手册文档。Python参考手册提供了更多的关于语言方面的正式说明。需要编写C或C++扩展,请阅读Python解释器的扩展和集成以及Python/CAPI参考手册。这几本书涵盖了各个深度上的Python知识。本手册不会涵盖Python的所有功能,也不会去解释所用到的所有相关的知识。相反,它介绍了许多Python中最引人注目的功能,这会对读者掌握这门语言的风格大有帮助。读过它后,你应该可以阅读和编写Python模块和程序了,接下来你可以从Python库参考手册中进一步学习Python复杂多变的库和模块了。1.开胃菜如果你写过大规模的Shell脚本,应该会有过这样的体会:你还非常想再加一些别的功能进去,但它已经太大、太慢、太复杂了;或者这个功能需要调用一个系统函数,或者它只适合通过C来调用……通常这些问题还不足以严肃到需要用C重写这个Shell;可能这个功能需要一些类似变长字符串或其它一些在Shell脚本中很容易找到的数据类型(比如文件名的有序列表),但它们用C来实现就要做大量的工作,或者,你对C还不是很熟悉。另一种情况:可能你需要使用几个C库来工作,通常C的编写/编译/测试/重编译周期太慢。你需要尽快的开发软件。也许你需要写一个使用扩展语言的程序,但不想设计一个语言,并为此编写调试一个解释器,然后再把它集成进你的程序。遇到以上情况,Python可能就是你要找的语言。Python很容易上手,但它是一门真正的编程语言,提供了比Shell多的多的结构,支持大型程序。另一方面,它提供了比C更多的错误检查,并且,作为一门高级语言,它拥有内置的高级数据类型,例如可变数组和字典,如果通过C来实现的话,这些工作可能让你大干上几天的时间。因为拥有更多的通用数据类型,Python适合比Awk甚至Perl更广泛的问题领域,在其它的很多领域,Python至少比别的语言要易用得多。Python可以让你把自己的程序分隔成不同的模块,这样就可以在其它的Python程序中重用。这样你就可以让自己的程序基于一个很大的标准模块集或者用它们作为示例来学习Python编程。Python中集成了一些类似文件I/O,系统调用,sockets,甚至像Tk这样的用户图形接口。Python是一门解释型语言,因为不需要编译和链接的时间,它可以帮你省下一些开发时间。解释器可以交互式使用,这样就可以很方便的测试语言中的各种功能,以便于编写发布用的程序,或者进行自下而上的开发。还可以当它是一个随手可用的计算器。Python可以写出很紧凑和可读性很强的程序。用Python写的程序通常比同样的C或C++程序要短得多,这是因为以下几个原因:l高级数据结构使你可以在一个单独的语句中表达出很复杂的操作;l语句的组织依赖于缩进而不是begin/end块;l不需要变量或参数声明。Python是可执行的:如果你会用C语言写程序,那就可以很容易的为解释器添加新的集成模块和功能,或者优化瓶颈,使其达到最大速度,或者使Python能够链接到所需的二进制架构上(比如某个专用的商业图形库)。等你真正熟悉这一切了,你就可以把Python集成进由C写成的程序,把Python当作这个程序的扩展或命令行语言。顺便说一下,这个语言的名字来源于BBC的“MontyPython'sFlyingCircus”节目,和凶猛的爬虫没有任何关系。在文档中引用MontyPython典故不仅是允许的,而且还受到鼓励!现在你已经了解了Python中所有激动人心的东西,大概你想仔细的试试它了。学习一门语言最好的办法就是使用它,你会很乐于这样做。下一节中,我们会很机械的说明解释器的用法。这没有什么神秘的,不过有助于我们练习后面展示的例子。本指南其它部分通过例子介绍了Python语言和系统的各种功能,开始是简单表达式、语法和数据类型,接下来是函数和模块,最后是诸如异常和自定义类这样的高级内容。2.使用Python解释器2.1调用解释器通常Python的解释器被安装在目标机器的/usr/local/bin/python目录下;把/usr/local/bin目录放进你的UNIXShell的搜索路径里,确保它可以通过输入python来启动。因为安装路径是可选的,所以也有可能安装在其它位置,你可以与安装Python的用户或系统管理员联系。(例如,/usr/local/python就是一个很常见的选择)输入一个文件结束符(UNIX上是Ctrl+D,Windwos上是Ctrl+Z)解释器会以0值退出(就是说,没有什么错误,正常退出--译者)。如果这没有起作用,你可以输入以下命令退出:importsys;sys.exit()解释器的行编辑功能并不很复杂。装在Unix上的解释器可能会有GNUreadline库支持,这样就可以额外得到精巧的交互编辑和历史记录功能。可能检查命令行编辑器支持能力最方便的方式是在主提示符下输入Ctrl+P。如果有嘟嘟声(计算机扬声器),说明你可以使用命令行编辑功能,从附录A可以查到快捷键的介绍。如果什么也没有发声,或者P显示了出来,说明命令行编辑功能不可用,你只有用退格键删掉输入的命令了。解释器的操作有些像UnixShell:使用终端设备作为标准输入来调用它时,解释器交互的解读和执行命令,通过文件名参数或以文件作为标准输入设备时,它从文件中解读并执行脚本。启动解释器的第三个方法是python-ccommand[arg]...这种方法可以在命令行中直接执行语句,等同于Shell的-c选项。因为Python语句通常会包括空格之类的特殊字符,所以最好把整个语句用双引号包起来。注意“pythonfile”和“pythonfile”是有区别的。对于后一种情况,程序中类似于调用input()和raw_input()这样的输入请求,来自于确定的文件。因为在解析器开始执行之前,文件已经完全读入,所以程序指向文件尾。在前一种情况(这通常是你需要的)它们从来自于任何联接到Python解释器的标准输入,无论它们是文件还是其它设备。使用脚本文件时,经常会运行脚本然后进入交互模式。这也可以通过在脚本之前加上-i参数来实现。(如果脚本来自标准输入,就不能这样运行,与前一段提到的原因一样。)2.1.1参数传递调用解释器时,脚本名和附加参数之传入一个名为sys.argv的字符串列表。没有脚本和参数时,它至少也有一个元素:sys.argv[0]此时为空字符串。脚本名指定为‘-’(表示标准输入)时,sys.argv[0]被设置为‘-’,使用-c指令时,sys.argv[0]被设定为‘-c’。-c命令之后的参数不会被Python解释器的选项处理机制所截获,而是留在sys.argv中,供脚本命令操作。2.1.2交互模式从tty读取命令时,我们称解释器工作于交互模式。这种模式下它根据主提示符来执行,主提示符通常标识为三个大于号(“”);继续的部分被称为从属提示符,由三个点标识(“...”)。在第一行之前,解释器打印欢迎信息、版本号和授权提示:pythonPython2.3(#1,Jul302003,23:22:59)[GCC3.220020927(prerelease)]oncygwinTypehelp,copyright,creditsorlicenseformoreinformation.输入多行结构时需要从属提示符了,例如,下面这个if语句:the_world_is_flat=1ifthe_world_is_flat:...printBecarefulnottofalloff!...Becarefulnottofalloff!2.2解释器及其环境2.2.1错误处理有错误发生时,解释器打印一个错误信息和栈跟踪(监视)器?。交互模式下,它返回主提示符,如果从文件输入执行,它在打印栈跟踪器后以非零状态退出。(异常可以由try语句中的except子句来控制,这样就不会出现上文中的错误信息)有一些非常致命的错误会导致非零状态下退出,这由通常由内部矛盾和内存溢出造成。所有的错误信息都写入标准错误流;命令中执行的普通输出写入标准输出。在主提示符或附属提示符输入中断符(通常是Control-CorDEL)就会取消当前输入,回到主命令行。[1]执行命令时输入一个中断符会抛出一个KeyboardInterrupt异常,它可以被try句截获。2.2.2执行Python脚本BSD系统中,Python脚本可以像Shell脚本那样直接执行,只要在脚本文件开头写一行命令,指定文件和模式:#!/usr/bin/envpython(将用户路径通知解释器)“#!”必须是文件的前两个字符,在某些平台上,第一行必须以Unix风格的行结束符(“\n”)结束,不能用Mac(“\r”)或Windows(“\r\n”)的结束符。注意,“#”是Python中是行注释的起始符。脚本可以通过chmod命令指定执行模式和许可权。$chmod+xmyscript.py2.2.3源程序编码Python的源文件可以通过编码使用ASCII以外的字符集。最好的做法是在#!行后面用一个特殊的注释行来定义字符集。#-*-coding:iso-8859-1-*-根据这个声明,Python会将文件中的字符尽可能的从指定的编码转为Unicode,在本例中,这个字符集是iso-8859-1。在Python库参考手册中可以找到可用的编码列表(根据我的实验,中文似乎只能用cp-936或utf-8,不直接支持GB,GBK,GB-18030或ISO-10646--译者注)。如果你的文件编辑器支持UTF-8格式,并且可以保存UTF-8标记(akaBOM-ByteOrderMark),你可以用这个来代替编码声明(看来至少Jext还不支持这样做,而Vim,我还没找到它的编码设置在哪里,还是老老实实的用注释行指定源代码的编码吧--译者注)。IDLE可以通过设定Options/General/DefaultSourceEncoding/UTF-8来支持它。需要注意的是旧版Python不支持这个标记(Python2.2或更早的版本),也同样不能使操作系统支持#!文件。使用UTF-8内码(无论是用标记还是编码声明),我们可以在字符串和注