Python核心编程(第二版)

978-7-115-17850-3
作者: 【美】Wesley J. Chun
译者: 宋吉广
编辑: 李际
分类: Python

图书目录:

详情

本书是经典的Python指导书,在第一版的基础上,针对Python进行了全面升级。全书分为两个主要部分:第一部分占据了大约三分之二的篇幅,阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程、模块、面向对象编程、执行环境等内容;第二部分则提供了各种高级主题来展示可以使用Python来做些什么,包括正则表达式、网络编程、网络客户端编程、多线程编程、图形用户界面编程、Web编程、数据库编程、扩展Python和一些其他材料。

图书摘要

版权信息

书名:Python核心编程(第二版)

ISBN:978-7-115-17850-3

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

• 著    [美] Wesley J. Chun

  译    宋吉广

  责任编辑 李 际

• 人民邮电出版社出版发行  北京市丰台区成寿寺路11号

  邮编 100164  电子邮件 315@ptpress.com.cn

  网址 http://www.ptpress.com.cn

• 读者服务热线:(010)81055410

  反盗版热线:(010)81055315


Authorized translation from the English language edition, entitled CORE PYTHON PROGRAMMING, 2nd Edition, 0132266937 by CHUN WESLEY J., published by Pearson Education, Inc, publishing as Prentice Hall, Copyright © 2007 Pearson Education, Inc.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means electronic or mechanical, including photocopying , recording or by any information storage retrieval system, without permission from Pearson Education,Inc.

CHINESE SIMPLIFIED language edition published by PEARSON EDUCATION ASLA LTD.,and POSTS & TELECOMMUNICATIONS PRESS Copyright ©2007.

本书封面贴有Pearson Education(培生教育出版集团)激光防伪标签。无标签者不得销售。


本书是经典的Python指导书,在第一版的基础上进行了全面升级。全书分为两个部分:第1部分占据了大约三分之二的篇幅,阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程、模块、面向对象编程、执行环境等内容:第2部分则提供了各种高级主题来展示可以使用Python做些什么,包括正则表达式、网络编程、网络客户端编程、多线程编程、图形用户界面编程、Web编程、数据库编程、扩展Python 和一些其他材料。

本书适合Python初学者,以及已经入门但想继续学习和提高自身Python技巧的程序员。


本书的翻译过程真是一波三折,前后丢了两次翻译好的书稿,坏处是拖延了本书与读者见面的时间,好处是质量得到了更好的保证。

最后书稿的顺利完成得到了中国Python社区的大力支持和帮助,每一个文字都包含着不止一个人的努力和付出,相信这本书的出版能够在一定意义上真正推动Python在中国软件开发界的普及和应用。

有人说,我们中国还是没有像国外那样的环境来开展自由与开源软件的教育和推广,这句话是有一定道理的,但这也正是需要我们不懈努力的原因之一。从无到有,从一到万,这个方向是不会变的,现在越来越多的企业和个人已经感觉到这件事情的重要性,政府和高校也在做很多探索和尝试。我们要做的,恐怕就是踏踏实实地做点事,文档的中文化、软件的汉化、开发社区的建立、线上线下的互动、实际项目的开发……自由与开源软件离不开中国软件领域人才的不懈努力和贡献,这件事也只有中国人自己才能够做好。这不是一个口号,而是事实。当周围的人在评说优劣好坏的时候,我们不妨俯下身子亲自看一看,用一用,而不是人云亦云。

做自由与开源软件需要好的环境,而好环境的构建是由其中每个参与者的心态所决定的,而不是由口水战、特殊事件来引导方向。等到了这个阶段,我们的社区也许就真的成熟了,环境也就做好了,这个环境的构建是一个自生系统,由内部相关人共同努力,而不是受外界舆论和政策导向的影响。

非常感谢人民邮电出版社计算机图书分社的刘涛副社长和李际编辑对自由与开源软件事业的支持,还要感谢付飞编辑对本书审校作出的贡献。

这是我个人负责翻译的第二本书,第一本是《Ubuntu官方指南》,一路走来感觉真的很累。技术翻译在中国还是一个“苦”差事,你越要较真,你就越“苦”,在书稿完成后,这种感觉又是“苦咖啡”的那种“苦”了,苦而留香。

本书是在无数贡献者坚持不懈的付出下才得以出版的。希望通过我们的努力,能让Python在中国落地开花,也希望读者能够记住所有辛勤的贡献者。

本书的翻译工作得到了中文Python用户组(CPyUG)的大力支持,是大家通力合作的结晶,贡献者有:

Zoom.Quiet、吴璟宇、Filia Tao、陆闻亮、任轶、王淑羽、杜军、魏忠、史振嵩、王金凤、谭金灿、张婷、黄冬、张沈鹏、孙承杰、严小松、tocer、路文杰等。

此外,还有两位不愿留下姓名的杰出贡献者,他们的英文名是phay和subowen。

宋吉广


我们很高兴能帮你尽快并尽可能深入地学习Python。掌握语法是本书的一个目标,不管怎样,我们都坚信,哪怕是一个初学者,只要他能掌握Python的运作机理,他就不再仅仅是用Python“编写”,而是能开发出更高效的Python应用程序。但是你知道,并不是掌握了一门语言的语法就能让你立刻登堂入室。

在本书中,你能发现许多可以立即上手的例子。为了巩固基础,你还会在每章的末尾找到有趣又富有挑战性的习题。这些初级和中级水平的习题可以检验你的学习效果,并且提升你的Python技巧。确实没有什么能代替经验,我们只是想尽量用最短的时间让你不止初涉Python,而且能学会驾驭它。

本书之所以比其他Python书籍畅销,是因为它拥有广泛的选题、丰富的例子和必要的深入解析。本书不需要你拥有C语言或者面向对象程序设计之类的背景。本书同样也不是一本让你很难入门的个案解析。最后,本书也绝非一本纯粹的参考书或者快速入门指南。你手中的这本书包括了针对这门语言特性的包罗万象的介绍(第一部分中),通过其下各章你可以洞悉Python编程的每个细节。

本书40%是介绍,40%是晋级,余下的20%则是参考。我们将目标锁定于那些已经熟悉某种其他高级语言的人士和大、中学生。因为Python可以应用于Zope、Plone、MailMan和Django等大型的解决方案,所以本书可能被主要用于与这些系统有关的开发、管理、维护和整合工作。

对于书中代码的关注,第一版大约三分之一的读者来信抱怨说书中没有足够多和足够成熟的应用程序。也有人说代码的例子不够长或者不够完整。其他人则全部写信说他们喜欢书中简洁易懂的例子,它们从不连篇累牍、乱人心智。我们偏爱提供简短代码背后的哲学是,让读者能学会窥一斑而知全豹。像搭积木一样步步深入,最终垒土成山,完成大型应用程序。书中大多数大型程序都有逐行解释。丰富的翻译代码注释遍布其中,你可以在学习Python的同时加以实践——尽可能充分地使用交互解释器。通过这个方法你不仅可以学习和提高Python水平,同时还能在向源文件粘贴代码之前就解决bug。

学习Python不能光学不练。你会发现每章的末尾的练习是本书的重要优势。它们可以检验你对该章主题和定义的理解,还能尽可能将你引向编码。开发应用程序是最快最高效学习程序设计语言所无可替代的方式。你将面对简单、中等、困难三种深度的问题。你要自己编写那些读者想在书中看到的“大”应用程序,而不是由我代劳,这将令你获益匪浅。附录A中有各章节部分练习的答案。

本书主要面向那些没有接触过Python的程序员和那些已经有所了解但想继续学习和提高自身Python技巧的程序员。Python已经被应用在了众多领域,包括工程、信息技术、科学、商务、娱乐,等等。这些领域涵盖了,但绝不局限于下列Python用户(以及本书读者):

一些知名的大公司都在使用着Python,例如:Google、雅虎、NASA、Lucasfilm/Industrial Light and Magic、Red Hat、Zope、迪斯尼、皮克斯和梦工厂。

我是十多年前在一家名为Four11的公司里初涉Python的。那时,公司拥有一个拳头产品—— Four11.com白页目录服务。Python当时被用于设计我们的下一个产品:Rocketmail在线电子邮件服务系统,也就是今天雅虎邮件系统的前身(白页是指用户信息数据库,Rocketmail是第一个主流的免费邮件系统。日后Four11被雅虎收购,雅虎使用Rocketmail的引擎开发了雅虎邮件——译者注)。

学习Python和加入最早的雅虎邮件引擎团队都是令人愉悦的。借此,我重构了地址簿和拼写检查程序。那时,Python的身影也逐渐出现在了其他的雅虎页面上。比如“网上寻友”(People Search)、“黄页”、“地图和出行路线”(Maps and Driving Directions)等,我还曾担任过“网上寻友”的主管工程师。

虽然当时Python对我来说是全新的,但是它却很容易上手——比我之前学过的语言都简单多了。由于当时Python教程的匮乏,所以我不得不使用《Python库参考手册》和《快速参考指南》作为我的学习工具,这也触发了我写作你手中这本书的念头。

我还在雅虎的日子里,就可以利用Python找到有趣的途径来完成五花八门的工作了。每次,Python的力量都能让我眼前一亮、信手拈来地化解问题。我同时还开发了一些Python课程,并将本书的内容用于授课,所以这真算得上是完全原创。

本书不仅是一本出众的学习用书,同样也是一部绝佳的Python教学用书。身为一位工程师,我知道如何学习、掌握、应用一门新技术。作为一名职业讲师,我也知道如何向顾客提供最高效的训练。正因为有了这些经验,才能给你带来真实情况的模拟和提示,这是你无法从那些仅仅是“训练师”或“书籍作者”的人那里获得的。

与一本严格意义上的“入门”读物或纯粹的计算机核心技术参考书籍不同的是,我的教学经验告诉我,一本易于阅读并且还能坚持技术导向的书才是最符合读者需求的。也只有这样的书才能让你尽可能以最快的速度提高Python,并能将其应用于你的任务中。我们引入概念,并配以相应的实例来加快学习进程。在每章的最后提供了许多练习,借此你可以巩固学到的概念并验证阅读中产生的想法。

能与Bruce Eckel的写作风格相提并论,让我们既感到荣幸,又觉得过誉了。这可不是一本枯燥的大学教材,作为作者,我是在和你交流,把你当作是我广受好评的Python培训班中的一员。作为一个终身学习者,我经常将自己置身于学生中,告诉你如何才能让你尽可能快速透彻地掌握概念。你将能够快速通畅的阅读本书,而不必去在意那些技术资料。

身为一名工程师,我知道为了让你掌握Python的概念需要传授什么。作为一个老师,我知道如何将技术细节凝炼成能让你轻松理解并能立刻上手的语言。本书充分地展现了我的写作风格和教学风格,但使用Python编程更是一种享受。

在本书第一版出版之后,随着2.0版的发布,Python进入了自己的第二个时代。自那之后,这门语言的重大进步为其带来了全面而持续的成功和认可。摒除了缺陷,加入了新特点,这为全球的Python开发者带来了新一级别的能力和挑战。我真的很担心,这本续作能否在涵盖所有激动人心的新特点的同时还保持原来简单易懂的特点。本书涵盖了2006年秋发布的Python 2.5版本,乃至一些关于将来2.6版的预告。如同第一版一样,我们的目标是让本书所有主题不受版本的影响,让读者能终身受用,而不是很快被淘汰。

Python的创始人Guido van Rossum一直慢慢酝酿着Python的下一次大转变,他亲切地称之为“Python 3000”。“Python 3000”和它的缩写“Py3k”都只是Python 3.0的代号。它会和2.x版本平行开发。尽管会产生一些和过去Python版本的不兼容,但是核心团队会尽全力确保绝大部分的向下兼容性(这也是Python新版本研发的惯例)。我们更加期盼能在摒除原有设计缺陷和争议的同时,添加更多有趣的特性。

在本版中加入的新主题包括:

此外,我们很高兴在本书中加入3章新内容:第17章、第21章和第23章。这3章里面有很多中级的内容会经常用到。所有原来的章节都已经更新到Python的最新版本。

本书分为两大部分:第一部分,占据了大约三分之二的篇幅,来向你阐释这门语言的“核心”内容。第二部分则提供了各种高级主题来向你展示你可以使用Python来做些什么。

Python无处不在——有时发现正在使用Python的人,以及他们正在用Python解决的工作是令人惊异的——尽管我们很高兴在本书中加入了许多主题,比如Java/Jython、Win32编程、使用HTMLgen处理CGI、使用第三方工具(wxWidgets、GTK+、Qt等)的GUI编程、XML处理、数字科学计算处理、视觉和图形图像处理、Web服务和应用程序框架(Zope、Plone、Django、TurboGears等),但是没有足够的时间将这些主题完善成独立的章节。不管怎样,我们很高兴至少针对这些Python发展的关键领域已经完成了很不错的介绍。这当然就包括前面提到的那些主题。

以下是每章概览:

第1章——欢迎来到Python世界

在开始的地方我们会介绍Python的历史、特性和优点等,当然还有如何获得和安装Python。

第2章——快速入门

如果你是一个有经验的程序员,只想看看Python如何工作的,这一章就是你想要去的地方。在这里我们会介绍Python中基本的概念和语句,其中很多内容对你来说也许会很熟悉,你可以只学习Python中正确的语法,然后直接开始你的项目了。

第3章——Python基础

本章将对Python的语法进行总览,并给出一些关于风格的注意事项。你可以接触到Python的关键词,还会了解它的内存管理能力。在本章的结尾将会出现你的第一个Python程序,你可以体会到真正的Python代码。

第4章——Python对象

本章主要介绍Python中的对象。除了一般对象的属性外,我们还会展示Python的数据类型和操作符,以及多种对标准类型的分类方法。本章还会涉及一部分内建函数,它们对绝大多数Python对象都有效。

第5章——数字

在这一章,我们会讨论Python主要的数字类型:整型、浮点型和复数。我们会研究对所有数字有效的操作符、内建函数以及工厂函数,还会简短地看一下其他相关的类型。

第6章——序列:字符串 、列表和元组

这一章是你遇到的第一个内容丰富的章节,它将向你展示Python中所有的序列类型:字符串、列表和元组、它们功能很强大。我们还会向你展示和每个类型有关的内建函数、方法及特性,当然还有所有的操作符。

第7章——映射和集合类型

字典是Python中的集合类型,又称散列类型。和其他数据类型一样,字典也有操作符、内建函数和方法。本章还会讲述集合类型,同样会讨论它们的操作符、内建函数、工厂函数和内建方法。

第8章——条件和循环

和许多其他高级编程语言一样,Python支持诸如for和while之类的循环,以及if语句(及相关内容)。Python还有一个内建函数range(),它可以使Python的for循环表现得像一个传统的计数循环,而不是像一个“foreach”迭代循环。本章还涵盖了一些辅助语句,例如break、continue和pass。还有一部分内容是关于新的结构,例如迭代器、列表解析和生成器表达式。

第9章——文件和输入输出

除了标准文件对象和输入/输出,本章还介绍了文件系统存取、文件执行和永久存储。

第10章——错误和异常

Python 的最强大的结构之一就是它的异常处理能力。在本章,你可以看到完全的处理过程,还有一些用来告诉我们如何引发或者抛出异常的指示。还有一点更重要的内容是如何创造我们自己的异常类。

第11章——函数和函数式编程

编写和调用函数相对而言还是比较直观的,但是Python还有许多特性会让你觉得有用,比如默认参数,“命名”参数或者说关键词参数、可变长度参数和函数式编程结构。我们还将粗略看一下变量范围和递归,另外还要讨论一些高级特性,比如生成器、装饰器、内部函数、闭包、偏函数程序(currying的更普遍形式)。

第12章——模块

Python的一个关键能力就是它的可扩充性。这种特性允许“即插即用”访问,还鼓励了代码复用。写成模块的程序可以被其他程序导入,过程简单到只要一行代码。此外,多模块的软件分发可以通过使用包(package)来简化。

第13章——面向对象编程

Python是个完全的面向对象(OO)编程语言,而且从一开始就是这样设计的。当然,Python不强迫你用这种方式编程,你可以继续开发结构式、过程式的代码。任何时间当你准备好利用OO编程的优势时,你可以转换到OO编程上。同样地,本章是为了指导你完全理解这些概念,还讨论了一些高级主题,例如操作符重载、定制和授权。本章还介绍了一些关于新式类的新特性,例如slot、属性(property)、描述符(descriptor)和元类(metaclass)。

第14章——执行环境

“执行”这个词可以有很多不同的意义,从可调用和可执行的对象到执行其他程序(Python或者其他的)。本章会讨论这些主题,以及通过操作系统接口来控制执行,另外还提出几种不同的终止执行的方法。

第15章——正则表达式

正则表达式是个非常强大的工具,可以用来进行模式匹配、提取和搜索-替换。本章可以学习到这些内容。

第16章——网络编程

如今有太多的程序是面向网络的。你该从何下手呢?可以从本章学习到如何使用TCP/IP和UDP/IP来创建客户端和服务器端,另外还可以初步了解SocketServer和Twisted。

第17章——网络客户端编程

在第16章中,我们介绍了如何使用套接字来进行网络编程。今天我们使用的绝大部分网络协议都是使用套接字开发的。在这一章,我们将探索更高一层的库,它们被用来创建上述网络协议的客户端。特别地,我们会关注FTP、NNTP、SMTP和POP3客户端。

第18章——多线程编程

多线程编程可以用来提高很多类型的程序的执行性能。很多人想要一些关于Python中多线程编程的文档,本章可以让这些呼声停止了,因为这里会解释概念,并向你展示如何正确的建造一个Python多线程程序。

第19章——图形用户界面编程

Tkinter是Python上的默认图形用户界面(GUI)开发模块,它是基于Tk图形工具集的。我们将向你展示如何打造一个简单的GUI程序例子(我至少要说10遍:真的非常快!)。最好的一种学习方法是复制,通过修改已有的这几个程序例子,你已经开始了你的GUI之旅。我们以一个较复杂的例子结束本章,当然还顺便介绍了Tix、Pmw、wxPython和PyGTK。

第20章——Web编程

我们使用Python编程一共有三个主要形式,即Web客户端、Web服务器和广受欢迎的通用网关接口(CGI)程序,后者用来帮助Web服务器传送动态产生的Web页面。本章将会包括所有内容:简单/高级的Web客户端和CGI程序,以及如何建立你自己的Web服务器。

第21章——数据库编程

对Python来说,数据库编程和其他类型的编程一样,都很简单、有趣。我们首先回顾一下基本的概念,然后介绍Python数据库的程序接口(API)。接着我们将向你展示如何才能连接到一个关系数据库,如何使用Python进行查询和其他操作。最后,如果你不想碰SQL,不想考虑底层的数据库而只想使用对象,我们将向你介绍一些对象-关系管理器(ORM),它们可以再次简化数据库编程。

第22章——扩展Python

我们以前提到过代码复用和语言扩展的强大性。在纯Python中,这些扩展是以模块形式存在的,但是你也可以使用C、C++或者Java来开发底层代码,并提供无缝的Python接口。使用低级别的编程语言编写你的扩展可以让你提高性能和安全性,因为源代码不需要公开。本章将一步一步介绍扩展的打造过程。

第23章——其他话题

本章包含了一些额外材料,我们会在下一版将它们扩展成全面、单独的章节。本章的主题包括Web服务、微软Office(Win32 COM 客户端)编程和Java/Jython。

书中某些标有星号(*)的段落和练习,表示其为晋级或者可选读的。它们通常是自成一体的,你可以在今后有时间的时候再研究。

如果你已经有了足够的编程知识,并且已经设置好了Python开发环境。那么你就可以跳过第1章,直接进入第2章了。从那里你可以理解Python并开始实际应用。

“核心笔记”图标

“核心风格”图标

“核心模块”图标

“核心提示”图标

Python的新功能以这个图标标注。图标中数字是指该功能首次出现时的版本号。

你可以在本书的网站(http://corepython.com)上找到:勘误表、更新、研讨预告、Python训练、下载和其他相关信息。

第二版致谢

审稿人和供稿人

Shannon -jj Behrens(权威审稿人)

Michael Santos(权威审稿人)

Rick Kwan

Lindell Aldermann(第6章Unicode新段落的合著者)

Wai-Yip Tung(第20章Unicode实例的合著者)

Eric Foster-Johnson(《Beginning Python》的合著者)

Alex Martelli(《Python Cookbook》的编辑和《Python in a Nutshell》的作者)

Larry Rosenstein

Jim Orosz

Krishna Srinivasan

Chuck Kung

精神动力

我出色的孩子和宠物仓鼠

出版

Mark Taub和Debra Williams-Cauley(组稿编辑)

Lara Wysong(策划编辑)

John Fuller(执行编辑)

Sam RC(International Typesetting and Composition项目主管)

第一版致谢

审稿人和供稿者

Guido van Rossum(Python语言的创始人)

Dowson Tong

James C. Ahlstrom(《Internet Programming with Python》的合著者)

S. Candelaria de Ram

Cay S. Horstmann(《Core Java and Core JavaServer Faces》的合著者)

Michael Santos

Greg Ward(distutils包和文档的创始人)

Vincent C. Rubino

Martijn Faassen

Emile van Sebille

Raymond Tsai

Albert L. Anders(多线程编程相关章节的合著者)

Fredrik Lundh(《Python Standard Library》一书作者)

Cameron Laird

Fred L. Drake, Jr.(《Python & XML》的合著者,Python官方文档的编辑)

Jeremy Hylton

Steve Yoshimoto

Aahz Maruch(《Python for Dummies》一书作者)

Jeffrey E. F. Friedl(《Mastering Regular Expressions》一书作者)

Pieter Claerhout

Catriona(Kate) Johnston

David Ascher(《Learning Python》的合著者,《Python Cookbook》的编辑)

Reg Charney

Christian Tismer(Stackless Python的创始人)

Jason Stillwell

以及我在加州大学圣克鲁斯分校的学生们

精神动力

James P.Prior(我高中的编程老师)

Louise Moser和P. Michael Melliar-Smith(我在UCSB(加州大学圣巴巴拉分校)的毕业论文指导教师)

Alan Parsons、 Eric Woolfson、Andrew Powell、Ian Bairnson、Stuart Elliott、David Paton和其他所有的项目参与者,以及那些Projectologists和Roadkillers的伙伴(感谢那些音乐、鼓励和美好的时光)。

我还要感谢我的家人、朋友和上司,是你们让我安稳地度过了那些秉烛而作却常常才思枯竭的疯狂岁月。最后,我还要向所有信任我的人献上最诚挚的感谢(你知道,我在说你!)——没有你们,我是无法取得今天的成绩的。那些不信任我的人……好吧,我想你知道你能做些什么!

最后,我还要深深地感谢你们,我的读者,以及Python社区。我非常高兴能指导你们学习Python ,并且希望在我们的第二次远航中你能与我们一同享受这段旅程!

Wesley Chun

加利福尼亚,硅谷

2006年7月



本章主题

开篇将介绍一些Python的背景知识,包括什么是Python、Python的起源和它的一些关键特性。一旦你来了兴致,我们就会向你介绍怎样获得Python,以及如何在你的系统上安装并运行它。本章最后的练习将会帮助你非常自如地使用Python,包括使用交互式解释器,以及创建并运行脚本程序。

Python是一门优雅而健壮的编程语言,它继承了传统编译语言的强大性和通用性,同时也借鉴了简单脚本和解释语言的易用性。它可以帮你完成工作,而且一段时间以后,你还能看明白自己写的这段代码。你会对自己如此快地学会它和它强大的功能感到十分的惊讶,更不用提你已经完成的工作了!只有你想不到,没有Python做不到。

Guido van Rossum于1989年底始创了Python,那时,他还在荷兰的CWI(Centrum voor Wiskun-
de en Informatica,国家数学和计算机科学研究院)。1991年初,Python发布了第一个公开发行版。这一切究竟是如何开始的呢?像C、C++、Lisp、Java和Perl一样,Python来自于某个研究项目,项目中的那些程序员利用手边现有的工具辛苦地工作着,他们设想并开发出了更好的解决办法。

那时van Rossum是一位研究人员,对解释型语言ABC有着丰富的设计经验,这个语言同样也是在CWI开发的。但是他不满足其有限的开发能力。已经使用并参与开发了像 ABC 这样的高级语言后,再退回到C语言显然是不可能的。他所期望的工具有一些是用于完成日常系统管理任务的,而且它还希望能够访问Amoeba分布式操作系统的系统调用。尽管van Rossum也曾想过为Amoeba开发专用语言,但是创造一种通用的程序设计语言显然更加明智,于是在1989年末,Python的种子被播下了。

尽管Python已经流行了超过15年,但是一些人仍旧认为相对于通用软件开发产业而言,它还是个新丁。我们应当谨慎地使用“相对”这个词,因为“网络时代”的程序开发,几年看上去就像几十年。

当人们询问:“什么是Python?”的时候,很难用任何一个具象来描述它。人们更倾向于一口气不加思索地说出他们对Python的所有感觉,Python是    (请填写),这些特点究竟又是什么呢?为了让你能知其所以然,我们下面会对这些特点进行逐一地阐释。

伴随着每一代编程语言的产生,我们会达到一个新的高度。汇编语言是献给那些挣扎在机器代码中的人的礼物,后来有了FORTRAN、C和 Pascal语言,它们将计算提升到了崭新的高度,并且开创了软件开发行业。伴随着C语言诞生了更多的像C++、Java这样的现代编译语言。我们没有止步于此,于是有了强大的、可以进行系统调用的解释型脚本语言,例如Tcl、Perl和Python。

这些语言都有高级的数据结构,这样就减少了以前“框架”开发需要的时间。像Python中的列表(大小可变的数组)和字典(哈希表)就是内建于语言本身的。在核心语言中提供这些重要的构建单元,可以鼓励人们使用它们,缩短开发时间与代码量,产生出可读性更好的代码。

在C语言中,对于混杂数组(Python中的列表)和哈希表(Python中的字典)还没有相应的标准库,所以它们经常被重复实现,并被复制到每个新项目中去。这个过程混乱而且容易产生错误。C++使用标准模板库改进了这种情况,但是标准模板库是很难与Python内建的列表和字典的简洁和易读相提并论的。

建议:面向对象编程为数据和逻辑相分离的结构化和过程化编程添加了新的活力。面向对象编程支持将特定的行为、特性以及和/或功能与它们要处理或所代表的数据结合在一起。Python的面向对象的特性是与生俱来的。然而,Python绝不像Java或Ruby仅仅是一门面向对象语言,事实上它融汇了多种编程风格。例如,它甚至借鉴了一些像Lisp和Haskell这样的函数语言的特性。

大家常常将Python与批处理或Unix系统下的shell相提并论。简单的shell脚本可以用来处理简单的任务,就算它们可以在长度上(无限度的)增长,但是功能总会有所穷尽。shell脚本的代码重用度很低,因此,你只能止步于小项目。实际上,即使一些小项目也可能导致脚本又臭又长。Python却不是这样,你可以不断地在各个项目中完善你的代码,添加额外的新的或者现存的Python元素,也可以随时重用代码。Python提倡简洁的代码设计、高级的数据结构和模块化的组件,这些特点可以让你在提升项目的范围和规模的同时,确保灵活性、一致性并缩短必要的调试时间。

“可升级”这个术语最经常用于衡量硬件的负载,通常指为系统添加了新的硬件后带来的性能提升。我们乐于在这里对这个引述概念加以区分,我们试图用“可升级”来传达一种观念,这就是:Python提供了基本的开发模块,你可以在它上面开发你的软件,而且当这些需要扩展和增长时,Python的可插入性和模块化架构则能使你的项目生机盎然和易于管理。

就算你的项目中有大量的Python代码,你也依旧可以有条不紊地通过将其分离为多个文件或模块加以组织管理。而且你可以从一个模块中选取代码,而从另一个模块中读取属性。更棒的是,对于所有模块,Python的访问语法都是相同的。不管这个模块是Python标准库中的还是你一分钟之前创造的,哪怕是你用其他语言写的扩展都没问题!借助这些特点,你会感觉自己根据需要“扩展”了这门语言,而且你已经这么做了。

代码中的瓶颈,可能是在性能分析中总排在前面的那些热门或者一些特别强调性能的地方,可以作为Python扩展用C重写。需要重申的是,这些接口和纯Python模块的接口是一模一样的,乃至代码和对象的访问方法也是如出一辙的。唯一不同的是,这些代码为性能带来了显著的提升。自然,这全部取决你的应用程序以及它对资源的需求情况。很多时候,使用编译型代码重写程序的瓶颈部分绝对是益处多多的,因为它能明显提升整体性能。

程序设计语言中的这种可扩展性使得工程师能够灵活附加或定制工具,缩短开发周期。虽然像C、C++乃至Java等主流第三代语言(3GL)都拥有该特性,但是这么容易地使用C编写扩展确实是 Python 的优势。此外,还有像PyRex这样的工具,允许C和Python混合编程,使编写扩展更加轻而易举,因为它会把所有的代码都转换成C语言代码。

因为Python的标准实现是使用C语言完成的(也就是CPython),所以要使用C和C++编写Python扩展。Python的Java实现被称作Jython,要使用Java编写其扩展。最后,还有IronPython,这是针对.NET或Mono平台的C#实现。你可以使用C#或者VB.Net扩展IronPython。

在各种不同的系统上可以看到Python的身影,这是由于在今天的计算机领域,Python取得了持续快速的成长。因为Python是用C写的,又由于C的可移植性,使得Python可以运行在任何带有ANSI C编译器的平台上。尽管有一些针对不同平台开发的特有模块,但是在任何一个平台上用Python开发的通用软件都可以稍事修改或者原封不动地在其他平台上运行。这种可移植性既适用于不同的架构,也适用于不同的操作系统。

Python关键字少、结构简单、语法清晰。这样就使得学习者可以在更短的时间内轻松上手。对初学者而言,可能感觉比较新鲜的东西就是Python的面向对象特点了。那些还未能全部精通OOP(Object Oriented Programming,面向对象的程序设计)的人对径直使用Python还是有所顾忌的,但是OOP并非必须或者强制的。入门也是很简单的,你可以先稍加涉猎,等到有所准备之后才开始使用。

Python与其他语言显著的差异是,它没有其他语言通常用来访问变量、定义代码块和进行模式匹配的命令式符号。通常这些符号包括:美元符号($)、分号(;)、波浪号(~)等。没有这些分神的家伙,Python代码变得更加定义清晰和易于阅读。让很多程序员沮丧(或者欣慰)的是,不像其他语言,Python没有给你多少机会使你能够写出晦涩难懂的代码,而是让其他人很快就能理解你写的代码,反之亦然。如前所述,一门语言的可读性让它更易于学习。我们甚至敢冒昧的声称,即使对那些之前连一行Python代码都没看过的人来说,那些代码也是相当容易理解的。

源代码维护是软件开发生命周期的组成部分。只要不被其他软件取代或者被放弃使用,你的软件通常会保持继续的再开发。这通常可比一个程序员在一家公司的在职时间要长得多了。Python项目的成功很大程度上要归功于其源代码的易于维护,当然这也要视代码长度和复杂度而定。然而,得出这个结论并不难,因为Python本身就是易于学习和阅读的。Python另外一个激动人心的优势就是,当你在阅读自己六个月之前写的脚本程序的时候,不会把自己搞得一头雾水,也不需要借助参考手册才能读懂自己的软件。

没有什么能够比允许程序员在错误发生的时候根据出错条件提供处理机制更有效的了。针对错误,Python提供了“安全合理”的退出机制,让程序员能掌控局面。一旦你的Python由于错误崩溃,解释程序就会转出一个“堆栈跟踪”,那里面有可用到的全部信息,包括你程序崩溃的原因,以及是哪段代码(文件名、行数、行数调用等)出错了。这些错误被称为异常。如果在运行时发生这样的错误,Python 使你能够监控这些错误并进行处理。

这些异常处理可以采取相应的措施,例如解决问题、重定向程序流、执行清除或维护步骤、正常关闭应用程序,亦或干脆忽略掉。无论如何,这都可以有效地缩减开发周期中的调试环节。Python的健壮性对软件设计师和用户而言都是大有助益的。一旦某些错误处理不当,Python也还能提供一些信息,作为某个错误结果而产生的堆栈追踪不仅可以描述错误的类型和位置,还能指出代码所在模块。

我们之前已经提到了Python是多么的易学易读。但是,你或许要问了,BASIC也是如此啊,Python有什么出类拔萃的呢?与那些封闭僵化的语言不同,Python有许多面向其他系统的接口,它的功能足够强大,本身也足够强壮,所以完全可以使用Python开发整个系统的原型。显然,传统的编译型语言也能实现同样的系统建模,但是Python工程方面的简洁性让我们可以在同样的时间内游刃有余地完成相同的工作。此外,大家已经为Python开发了为数众多的扩展库,所以无论你打算开发什么样的应用程序,都可能找到先行的前辈。你所要做的全部事情,就是来个“即插即用”(当然,也要自行配置一番)!只要你能想得出来,Python模块和包就能帮你实现。Python标准库是很完备的,如果你在其中找不到所需的,那么第三方模块或包就会为你完成工作提供可能。

C或者C++最大的弊病在于内存管理是由开发者负责的。所以哪怕是对于一个很少访问、修改和管理内存的应用程序,程序员也必须在执行了基本任务之外履行这些职责。这些加在开发者身上的没有必要的负担和责任常常会分散精力。

在Python中,由于内存管理是由Python解释器负责的,所以开发人员就可以从内存事务中解放出来,全神贯注于最直接的目标,仅仅致力于开发计划中首要的应用程序。这会使错误更少、程序更健壮、开发周期更短。

Python是一种解释型语言,这意味着开发过程中没有了编译这个环节。一般来说,由于不是以本地机器码运行,纯粹的解释型语言通常比编译型语言运行得慢。然而,类似于Java,Python实际上是字节编译的,其结果就是可以生成一种近似机器语言的中间形式。这不仅改善了Python的性能,还同时使它保持了解释型语言的优点。

核心笔记:文件扩展名

Python源文件通常用.py扩展名。当源文件被解释器加载或者显式地进行字节码编译的时候会被编译成字节码。由于调用解释器的方式不同,源文件会被编译成带有.pyc或.pyo扩展名的文件,你可以在第12章学到更多的关于扩展名的知识。

得到所有Python相关软件最直接的方法就是去访问它的网站(http://python.org)。为了方便读者,你也可以访问本书的网站(http://corepython.com)并点击左侧的“Download Python”链接——我们在表格中罗列了当前针对大多数平台的Python版本,当然,这还是主要集中在“三巨头”身上:Unix,Win32和MacOS X。

正如我们在前面1.3.5小节中提到的,Python可应用的平台非常广泛。我们可以将其划分成如下的几大类和可用平台:

Python大部分的最近版本都只是针对“三巨头”的。实际上,最新的Linux和MacOS X版本都已经安装好了Python——你只需查看一下是哪个版本。尽管其他平台只能找到相对较早的2.x对应版本,但是就1.5版而言这些版本也有了显著的改进。一些平台有其对应二进制版本,可以直接安装,另外一些则需要在安装前手工编译。

Unix衍生系统(Linux,MacOS X,Solaris,FreeBSD等)

正如前文所述,基于Unix的系统可能已经安装了Python。最好的检查方法就是通过命令行运行Python,查看它是否在搜索路径中而且运行正常。只需输入:

myMac:~wesley$ python
Python 2.4(#4,Mar 19 2005,03:25:10)
[GCC 3.3 20030304(Apple Computer,Inc. build 1671)]on Darwin
Type "help","copyright","credits" or "license" for more information.
">>>"

Windows/DOS系统

首先从前文提到的python.org或是corepython.com网站下载msi文件(例如,python-2.5.msi),之后执行该文件安装Python。如果你打算开发Win32程序,例如使用COM或MFC,或者需要Win32库,强烈建议下载并安装Python的Windows扩展。之后你就可以通过DOS命令行窗口或者IDLE和Pythonwin中的一个来运行Python了,IDLE是Python缺省的IDE(Integrated Development Environment,集成开发环境),而Pythonwin则来自Windows扩展模块。

自己动手编译Python

对绝大多数其他平台,下载.tgz文件,解压缩这些文件,然后执行以下操作以编译Python。

1../configure
2.make
3.make install

Python通常被安装在固定的位置,所以你很容易就能找到。如今,在系统上安装多种版本的Python已经是司空见惯的事情了。虽然容易找到二进制执行文件,你还是要设置好库文件的安装位置。

在Unix中,可执行文件通常会将Python安装到/usr/local/bin子目录下,而库文件则通常安装在/usr/ local/lib/python2.x子目录下,其中的2.x是你正在使用的版本号。MacOS X系统中,Python则安装在/sw/bin以及/或者/usr/local/bin子目录下。而库文件则在/sw/lib、usr/local/lib,以及/或者/Library/ Frameworks/ Python.framework/Versions子目录下。

在Windows中,默认的安装地址是C:\Python2x。请避免将其安装在C:\Program Files目录下。是的,我们知道这是通常安装程序的文件夹。但是DOS是不支持“Program Files”这样的长文件名的,它通常会被用“Progra~1”这个别名代替。这有可能给程序运行带来一些麻烦,所以最好尽量避免。所以,听我的,将Python安装在C:\Python目录下,这样标准库文件就会被安装在C:\Python\Lib目录下。

有三种不同的办法来启动Python。最简单的方式就是交互式的启动解释器,每次输入一行Python代码来执行。另外一种启动Python的方法是运行Python脚本。这样会调用相关的脚本解释器。最后一种办法就是用集成开发环境中的图形用户界面运行Python。集成开发环境通常整合了其他的工具,例如集成的调试器、文本编辑器,而且支持各种像CVS这样的源代码版本控制工具。

在命令行上启动解释器,你马上就可以开始编写Python代码。在Unix,DOS或其他提供命令行解释器或shell窗口的系统中,都可以这么做。学习Python的最好方法就是在交互式解释器中练习。在你需要体验Python的一些特性时,交互式解释器也非常有用。

Unix衍生系统(Linux,MacOS X,Solaris,FreeBSD等)

要访问Python,除非你已经将Python所在路径添加到系统搜索路径之中,否则就必须输入Python的完整路径名才可以启动Python。Python一般安装在/usr/bin或/usr/local/bin子目录中。

我们建议读者把Python(python执行文件,或Jython执行文件——如果你想使用Java版的解释器的话)添加到你的系统搜索路径之中,这样你只需要输入解释器的名字就可以启动Python解释器了,而不必每次都输入完整路径。

要将Python添加到搜索路径中,只需要检查你的登录启动脚本,找到以set path或PATH=指令开始,后面跟着一串目录的那行,然后添加解释器的完整路径。所有事情都做完之后,更新一下shell路径变量。现在在Unix提示符(根据shell的不同可能是%或$)处键入python(或jython)就可以启动解释器了,如下所示。

$ python

Python启动成功之后,你会看到解释器启动信息,表明Python的版本号及平台信息,最后显示解释器提示符“>>>”等待你输入Python命令。

Windoes/DOS环境

为了把 Python 添加到搜索路径中,你需要编辑 C:\autoexec.bat 文件并将完整的 Python 安装路径添加其中。这通常是C:\Python或C:\Program Files \Python(或是“Program Files”在DOS下的简写名字C:\Progra~1\Python)。

要想在DOS中将Python添加到搜索路径中去,需要编辑C:\autoexec.bat文件,把Python的安装目录添加上去。一般是C:\Python或C:\Program Files\Python(或者它在DOS中的简写名字C:\Progra~1\Python)。在一个DOS窗口中(它可以是纯DOS环境或是在Windows中的启动的一个DOS窗口)启动Python的命令与Unix操作系统是一样的,都是“python”,它们唯一的区别在于提示符不同,DOS中是C:>,如图1-1所示。

图1-1 在一个UNIX(MacOS X)窗口启动Python时的屏幕画面

C:\> python

命令行选项

当从命令行启动Python的时候,可以给解释器一些选项。这里有部分选项可供选择。

d   提供调试输出。

o   生成优化的字节码(生成 .pyo 文件)。

s   不导入 site模块以在启动时查找Python路径。

v    冗余输出(导入语句详细追踪)。

m mod 将一个模块以脚本形式运行。

Q opt 除法选项(参阅文档)。

c cmd 运行以命令行字符串形式提交的 Python 脚本。

file   从给定的文件运行Python脚本(参阅后文)。

图1-2 在一个DOS/命令行 窗口启动 Python

Unix衍生系统(Linux,MacOS X,Solaris,FreeBSD等)

不管哪种Unix平台,Python脚本都可以像下面这样,在命令行上通过解释器执行。

$ python script.py

Python脚本使用扩展名.py,上面的例子也说明了这一点。

Unix平台还可以在不明确指定Python解释器的情况下,自动执行Python 解释器。如果你使用的是类Unix平台,你可以在你的脚本的第一行使用shell魔术字符串(“sh-bang”)。

#!/usr/local/bin/python

在#!之后写上Python解释器的完整路径,我们前面曾经提到,Python解释器通常安装在 /usr/local/bin或/usr/bin目录下。如果Python没有安装到那里,你就必须确认你的Python解释器确实位于你指定的路径。错误的路径将导致出现类似于“找不到命令”的错误信息。

有一个更好的方案,许多Unix系统有一个命令叫env,位于/bin或/usr/bin中。它会帮你在系统搜索路径中找到python解释器。如果你的系统拥有env,你的启动行就可以改为下面这样。

#!/usr/bin/env python

或者,如果你的env位于/bin的话,

#!/bin/env python

当你不能确定Python的具体路径或者Python的路径经常变化时(但不能挪到系统搜索路径之外),env 就非常有用。当你在你的脚本首行书写了合适的启动指令之后,这个脚本就能够直接执行。当调用脚本时,会先载入Python解释器,然后运行你的脚本。我们刚才提到,这样就不必显式调用Python 解释器了,而只需要键入脚本的文件名。

$ script.py

注意,在键入文件名之前,必须先将这个文件的属性设置为可以执行。在文件列表中,你的文件应该将它设置为自己拥有rwx权限。如果在确定Python安装路径,或者改变文件权限,或使用chmod 命令时遇到困难,请和系统管理员一道检查一下。

Windows/DOS环境

DOS命令窗口不支持自动执行机制,不过至少在WinXP当中,它能像在Windows 中一样做到通过输入文件名执行脚本,这就是“文件类型”接口。这个接口允许Windows根据文件扩展名识别文件类型,从而调用相应的程序来处理这个文件。举例来说,如果你安装了带有PythonWin的Python,双击一个带有.py扩展名的Python脚本就会自动调用Python或PythonWin IDE(如果你安装了的话)来执行你的脚本。运行以下命令就和双击它的效果一样。

C:\> script.py

这样无论是基于Unix操作系统还是Win32操作系统都可以无需在命令行指定Python解释器的情况下运行脚本,但是如果调用脚本时,得到类似“命令无法识别”之类的错误提示信息,你也总能正确处理。

你也可以从图形用户界面环境运行Python,你所需要的是支持Python的GUI程序。如果你已经找到了一个,很有可能它恰好也是集成开发环境。集成开发环境不仅仅是图形接口,通常会带有源代码编辑器、追踪和排错工具。

Unix衍生系统(Linux,MacOS X,Solaris,FreeBSD等)

IDLE可以说是Unix平台下Python的第一个集成开发环境(IDE)。最初版本的IDLE也是Guido van Rossum开发的,在Python1.5.2中,它首次露面。IDLE代表的就是IDE,只不过多了一个“L”。我猜测,IDLE是借用了“Monty Python”一个成员的名字[1]...嗯...IDLE基于Tkinter,要运行它的话你的系统中必须先安装Tcl/Tk。目前的Python发行版都带有一个迷你版的Tcl/Tk库,因此就不再需要 Tcl/Tk 的完整安装了。

如果你已经在系统中安装好了Python,或者你有一个Python RPM包,可是它并没有包含 IDLE或Tkinter,那在你尝试IDLE之前,必须先将这两样东西安装好。(如果你需要,确实有一个独立的Tkinter RPM包可供下载,以便和Python一起工作)如果你是自己编译的Python,而且有Tk库可用,那Tkinter 会自动编译进Python,而且Tkinter和IDLE也会随Python的安装而安装。

如果你打算运行IDLE,就必须找到你的标准库安装位置:/usr/local/lib/python2.x/idlelib/idle.py。如果你是自己编译Python,你会在/usr/local/bin 目录中发现一个名为idle的脚本,这样你就可以在shell命令行中直接运行idle。图1-3是类Unix系统下的IDLE界面。MacOS X 是一个非常类似Unix(基于mach内核,BSD服务)的操作系统。在MacOS X下,Python可以用传统的Unix编译工具编译。MacOS X发行版自带一个编译好的Python解释器,不过并没有任何一个面向Mac的特殊工具(比如GNU readline,IDE等),当然也没有Tkinter和IDLE。

你可能会打算自己下载并编译一个出来,不过要小心一点,有时你新安装的Python会与Apple预装的版本混淆在一起。认真一点没有坏处。你也可以通过 Fink/Finkcommander 和DarwinPorts得到MacOS X版的Python。

http://fink.sourceforge.net/

http://darwinports.org

如果要得到最新Mac版Python的组建和信息,请访问如下网页

http://undefined.org/python

http://pythonmac.org/packages

另一个选择是从Python站点下载MacOS X的通用二进制包。这个磁盘映像文件(DMG)要求操作系统版本至少为10.3.9,它适用于基于PowerPC和Intel硬件的Mac机器。

图1-3 在Unix中启动IDLE

Windows环境

PythonWin是Python的第一个Windows接口,并且还是个带有图形用户界面的集成开发环境。PythonWin发行版本中包含WindowsAPI和COM扩展。PythonWin本身是针对MFC库编写的,它可以作为开发环境来开发你自己的Windows应用程序。你可以从下面给出的网页中下载并安装它。

PythonWin通常被安装在和Python相同的目录中,在它自己的安装目录C:\Python2x\Lib\ site-packages\pythonwin中有可执行的启动文件pythonwin.exe。PythonWin拥有一个带有颜色显示的编辑器、一个新的增强版排错器、交互shell窗口、COM扩展和更多的有用特性。如图1-4就是运行在Windows上的PythonWin集成开发环境的屏幕截图。

图1-4 Windows环境中的PythonWin

你可以在下面由Mark Hammond维护的网站中找到更多的关于PythonWin和Python针对Windowns的扩展(也被称为“win32all”)。

http://starship.python.net/crew/mhammond/win32/

http://sourceforge.net/projects/pywin32/

IDLE也有Windows平台版本,这是由Tcl/ Tk和Python/ Tkinter的跨平台性特点决定的,它看上去很像Unix平台下的版本,如图1-5所示。

图1-5 在Windows中启动IDLE

在Windows平台下,IDLE可以在Python编译器通常所在的目录C:\Python2x下的子目录Lib\idlelib中找到。从DOS命令行窗口中启动IDLE,请调用idle.py。你也可以从Windows环境中调用idle.py,但是会启动一个不必要的DOS窗口。取而代之的方法是双击idle.pyw,以.pyw作为扩展名的文件不会通过打开DOS命令行窗口来运行脚本。事实上你可以在桌面上创建一个到C:\Python2x\Lib\idlelib\
idle.pyw的快捷方式,然后双击启动就可以了,简单吧!

很多的软件开发专家事实上会选择在他们喜欢的文本编辑器中编写代码,比如vi(m) 或者emacs。除了这些和上面提到到的集成开发环境,还有大量的开源和商业的集成开发环境,下面是个简短的列表。

开源

   http://python.org/idle/

   http://starship.python.net/crew/skippy/win32

   http://ipython.scipy.org

   http://starship.python.net/crew/mike/Idle

   http://pydev.sf.net

   http://eclipse.org/

商业

  http://wingware.com/

  http://activestate.com/Products/Komodo

通用集成开发环境列表

http://wiki.python.org/moin/IntegratedDevelopmentEnvironments

核心提示:运行本书中的代码实例

在本书中,你会发现很多的Python脚本样例,可以从本书的网站上下载。但是当你运行它们的时候,请记住这些代码是设计用来从命令行(DOS命令行窗口或Unix shell)或者集成开发环境执行的。如果你在使用Win32系统,双击Python程序会打开DOS窗口,但是在脚本执行完毕后就会关闭,所以你可能看不到输出结果。如果你遇到了这种情况,就直接打开DOS窗口,从命令行中运行相关的脚本,或者在集成开发环境中执行脚本。另外一种办法,就是在脚本的最后一行后面添加raw_input( )语句,这样就可以保持窗口开着,直到你按下回车键才关闭。

Python文档可以在很多地方找到,最便捷的方式就是从Python网站查看在线文档。如果你没上网,并且使用的是Win32系统,那么在C:\Python2x\Doc\目录下会找到一个名为Python2x.chm的离线帮助文档。它使用IE接口,所以你实际上是使用网页浏览器来查看文档。其他的离线文档包括PDF和PostScript(PS)文件。最后,如果你下载了Python发行版,你会得到LaTeX格式的源文件。

在本书的网站中,我们创建了一个包括绝大多数Python版本的文档,只要访问http://corepython.com,单击左侧的“Documentation”就可以了。

Python已经和很多语言比较过了。一个原因就是Python提供了很多其他语言拥有的特性,另外一个原因就是Python本身也是由诸多其他语言发展而来的,包括ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell和其他的脚本语言,等等。Python就是“浓缩的精华”:Van Rossum研究过很多语言,从中吸收了许多觉得不错的特性,并将它们溶于一炉。

然而,往往因为Python是一门解释型语言,你会发现大多数的比较是在Perl、Java、Tcl,还有JavaScript之间进行的。Perl是另外一种脚本语言,远远超越了标准的shell脚本。像Python一样,Perl赋予了你所有编程语言的功能特性,还有系统调用能力。

Perl最大的优势在于它的字符串模式匹配能力,其提供了一个十分强大的正则表达式匹配引擎。这使得Perl实际上成为了一种用于过滤、识别和抽取字符串文本的语言,而且它一直是开发Web 服务器端CGI(common gateway interface,通用网关接口)网络程序的最流行的语言。Python的正则表达式引擎很大程度上是基于Perl的。

然而,Perl语言的晦涩和对符号语法的过度使用,让解读变得很困难。这些语法令初学者不得精要,为他们的学习带来了不小的阻碍。Perl的这些额外的“特色”使得完成同一个任务会有多个方法,进而引起了开发者之间的分歧。最后,通常当你想阅读几个月前写的Perl脚本的时候都不得不求助参考书。

Python也经常被拿来和Java作对比,因为他们都有类似的面向对象的特性和语法。Java的语法尽管比C++简单的多,但是依旧有些繁琐,尤其是当你想完成一个小任务的时候。Python的简洁与纯粹使用Java相比提供了更加快速的开发环境。在Python和Java的关系上,一个非常重大的革命就是Jython的开发。Jython是一个完全用Java开发的Python解释器,现在可以在只有Java虚拟机的环境中运行Python程序。我们会在后面的章节中简单讲述Jython的更多优点,但是现在就可以告诉你:在Jython的脚本环境中,你可以熟练地处理Java对象,Java可以和Python对象进行交互,你可以访问自己的Java标准类库,就如同Java一直是Python环境的一部分一样。

现在,由于Rails项目的流行,Python也经常被拿来和Ruby进行比较。就像前面我们提到的,Python是多种编程范式的混合,它不像Ruby那样完全面向对象,也没有像Smalltalk那样的块,或许这正是Ruby最引人注目的特性。Python有一个字节码解释器,而Ruby没有。Python更加易读,而Ruby事实上可以看作是面向对象的Perl。相对于Rails,Python有几个自己的Web应用框架,比如Django和Turbogears这两个项目。

Tcl是另一种可以与Python相提并论的脚本语言。Tcl是最易于使用的脚本语言之一,程序员很容易像访问系统调用一样对Tcl语言进行扩展。Tcl直到今天仍然很流行,与Python相比,它或许有更多局限性(主要是因为它有限的几种数据类型),不过它也拥有和Python一样的通过扩展超越其原始设计的能力。更重要的是,Tcl通常总是和它的图形工具包Tk一起工作,一起协同开发图形用户界面应用程序。因为它非常流行,所以Tk已经被移植到Perl(Perl/Tk)和Python(Tkinter)中。同样有一个有争议的观点,那就是与Tcl相比,因为Python有类、模块及包的机制,所以写起大程序来更加得心应手。

Python有一点点函数化编程(functional programming ,FP)结构,这使得它有点类似于List或Scheme语言。尽管Python不是传统的函数化编程语言,但它持续地从Lisp和haskell语言中借用一些有价值的特性。举例来说,列表解析就是一个广受欢迎的来自Haskell的特性,而Lisp程序员在遇到lambda、map、filter和reduce时也会感到异常亲切。

JavaScript 是另外一种非常类似Python的面向对象脚本语言。优秀的JavaScript程序员学起Python来易如反掌。 聪慧的读者会注意到JavaScript是基于原型系统的,而Python则遵循传统的面向对象系统,这使得二者的类和对象有一些差异。

下面列出了有关Python与其他语言进行比较的网页。

Perl

http://www2.linuxjournal.com/article/3882

http://llama.med.harvard.edu/~fgibbons/PerlPythonPhrasebook.html

http://aplawrence.com/Unixart/pythonvsperl.html

http://pleac.sf.net/pleac_python

http://www.garshol.priv.no/download/text/perl.html

Java

http://dirtsimple.org/2004/12/python-is-not-java.html

http://twistedmatrix.com/users/glyph/rant/python-vs-java.html

http://netpub.cstudies.ubc.ca/oleary/python/python_java_comparison.php

Lisp

http://strout.net/python/pythonvslisp.html 

http://norvig.com/python-lisp.html

Ruby

http://blog.ianbicking.org/ruby-python-power.html

http://www.rexx.com/~oinkoink/Ruby_v_Python.html

http://dev.rubycentral.com/faq/rubyfaq-2.html

Perl、C++

http://strombergers.com/python/

Perl、Java、C++

http://furryland.org/~mikec/bench/

C++、Java、Ruby

http://dmh2000.com/cjpr

Perl, Java, PHP, Tcl

http://www-128.ibm.com/developerworks/linux/library/l-python101.html

http://www-128.ibm.com/developerworks/linux/library/l-script-survey/

C、C++、Java、Perl、Rexx、Tcl

http://www.ubka.uni-karlsruhe.de/indexer-vvv/ira/2000/5

你可以在下面的网址中看到更多Python与其他的语言的比较:

http://www.python.org/doc/Comparisons.html

1.8 其他实现

标准版本的Python是用C来编译的,又被称为Cpython。除此之外,还有一些其他的Python实现。我们将在下面讲述些实现,除了本书中提到的这些实现以外,下面的网址还有更多的实现版本。

http://python.org/dev/implementations.html

Java

我们在上一节中曾经提到,还有一个可以用的 Python解释器是完全由Java写成的,名为Jython。尽管两种解释器之间存在一些细微的差别,但是它们非常接近,而且启动环境也完全相同。那Jython又有哪些优势呢?Jython...

对 Jython 进行详细论述,超出了本文的范围,不过网上有非常多的Jython信息。Jython目前仍然在不断开发之中,不时会增加新的特性。你可以通过访问Jython的网站得到更多有用的信息。

http://jython.org

.NET/Mono

现在已经有一个名为IronPython的Python实现,它是用C# 语言完成的,它适用的环境是.NET和Mono。你可以在一个.NET应用程序中整合IronPython 解释器来访问.NET对象。ronPython的扩展可以用C#或VB.NET语言编写。除此之外,还有一种名为Boo的.NET/Mono语言。你可以在下面的网址获得更多关于IronPython和Boo语言的信息。

http://codeplex.com/Wiki/View.aspx?ProjectName=IronPython

http://boo.codehaus.org/

Stackless

CPython的一个局限就是每个Python函数调用都会产生一个C函数调用(从计算机科学的角度来说,我们在讨论栈帧)。这意味着同时产生的函数调用是有限制的,因此Python难以实现用户级的线程库和复杂递归应用。一旦超越这个限制,程序就会崩溃。你可以通过使用一个“stackless”的Python实现来突破这个限制,一个C栈帧可以拥有任意数量的Python栈帧,这样你就能够拥有几乎无穷的函数调用,并能支持巨大数量的线程,这个Python实现的名字就叫……Stackless(嘿嘿,很惊讶吗?)

Stackless唯一的问题就是它要对现有的CPython 解释器做重大修改,所以它几乎是一个独立的分支。另一个名为Greenlets 的项目也支持微线程,它是一个标准的C扩展,因此不需要对标准Python解释器做任何修改。通过以下网址你能了解更多信息。

http://stackless.com

http://codespeak.net/py/current/doc/greenlet.html

1.9 练习

1-1. 安装Python。请检查Python是否已经安装到你的系统上,如果没有,请下载并安装它。

1-2. 执行Python。有多少种运行Python的不同方法?你喜欢哪一种?为什么?

1-3. Python标准库。

(a)请找到系统中Python执行程序的安装位置和标准库模块的安装位置。

(b)看看标准库里的一些文件,比如string.py。这会帮助你适应阅读Python脚本。

1-4. 交互执行。启动你的Python交互解释器。你可以通过输入完整的路径名来启动它。当然,如果你已经在搜索路径中设置了它的位置,那么只输入它的名字(python 或者python.exe)就行了(你可以任选最适合你的的Python实现方式,例如命令行、图形用户接口/集成开发环境、Jython、IronPython或者Stackless)。启动界面看上去就像本章描述的一样,一旦你看到>>>提示符,就意味着解释器准备好要接受你的Python命令了。

试着输入命令print 'Hello World!'(然后按回车键),完成著名的Hello World!程序,然后退出解释器。在Unix系统中,按下Ctrl+D会发送EOF信号来中止Python解释器,在DOS系统中,使用的组合键是Ctrl+Z。如果要从Macintosh、PythonWin、Windows或Unix中的IDLE这样的图形用户环境中退出,只要简单的关闭相关窗口就可以了。

1-5. 编写脚本。作为练习1-4的延续,创建“Hello World!”的Python脚本其实和上面的交互性练习并不是一回事。如果你在使用Unix系统,尝试建立自动运行代码行,这样你就可以在没有调用Pyton解释器的情况下运行程序了。

1-6. 编写脚本。使用print语句编写脚本,在屏幕上显示你名字、年龄、最喜欢的颜色和与你相关的一些事情(背景、兴趣、爱好等)。

[1] 译注1:Monty Python,也称“蒙地蟒蛇”,是英国的一个6人喜剧团体,在20世纪70年代的电视剧和80年代的电影作品红极一时。Guido van Rossum就是该团体的忠实影剧迷,故而将本语言命名为Python。这里的IDLE指的是其成员Eric Idle。


相关图书

深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
动手学自然语言处理
动手学自然语言处理
Web应用安全
Web应用安全
Python高性能编程(第2版)
Python高性能编程(第2版)
图像处理与计算机视觉实践——基于OpenCV和Python
图像处理与计算机视觉实践——基于OpenCV和Python
Python数据科学实战
Python数据科学实战

相关文章

相关课程