当前: 首页 - 图书专区 - Python学习手册(原书第4版)
Python学习手册(原书第4版)


  教辅下载
  在线购买
(美) Mark Lutz 著
978-7-111-32653-3
119.00
928
2011年03月29日
李军 刘红伟 等译
计算机 > 软件与程序设计 > 综合
OReilly Associates
24097
简体中文
16
Learning Python(4E)
店面
O''Reilly精品图书系列
陈佳媛







相关新闻
本书是学习Python编程语言的入门书籍,目标是让读者快速掌握核心Python语言基础,从Python语言最基础和最核心的功能开始介绍,每章、每部分都配有丰富的习题,帮助读者巩固所学的知识。
Python学习手册(第4版)
  Google和YouTube由于Python的高可适应性、易于维护以及适合于快速开发而采用它。本书将帮助你使用Python编写出高质量、高效的并且易于与其他语言和工具集成的代码。本书根据Python专家Mark Lutz的著名培训课程编写而成,是易于掌握和自学的Python教程。
  本书每一章都对Python语言的关键内容做单独讲解,并且配有章首习题,便于你学习新的技能并巩固加深自己的理解。书中配有大量注释的示例以及图表,它们都将帮助你轻松地学习Python 3.0。
本书主要内容
  学习Python的主要内建对象类型:数字、列表和字典。
  使用Python语句创建和处理对象,并且学习Python的通用语法模型。
  使用函数构造和重用代码,函数是Python的基本过程工具。
  学习Python模块:封装语句、函数以及其他工具,以便构建较大的组件。
  学习Python的面向对象编程工具,用于组织程序代码。
  学习异常处理模型,以及用于编写较大程序的开发工具。
  了解高级Python工具,如装饰器、描述器、元类和Unicode处理等。

“对于那些想要开始使用Python编程的人来说,本书是我所推荐图书中的首选。”
——Doug Hellmann,Racemi公司, 高级软件工程师


  Mark Lutz是世界级的Python培训讲师。他是畅销Python书籍的作者,从1992年起,他就是Python社区的先锋。他也是 《Programming Python》、 《Python Pocket Reference》和《Learning Python》等书的作者。
本书是学习Python编程语言的入门书籍。Python是一种很流行的开源编程语言,可以在各种领域中用于编写独立的程序和脚本。Python免费、可移植、功能强大,而且使用起来相当容易。来自软件产业各个角落的程序员都已经发现,Python对于开发者效率和软件质量的关注,这无论在大项目还是小项目中都是一个战略性的优点。
  无论你是编程初学者,还是专业开发人员,本书的目标是让你快速掌握核心Python语言基础。阅读本书后,你会对Python有足够的了解,能够将其应用于所从事的领域中。
  本书设计成一本教程,主要关注核心Python语言本身,而不是其特定的应用程序。因此,它作为一个两卷本的合集中的第一本:
  《Learning Python》,也就是这本书,介绍Python本身。
  《Programming Python》,另外一本书,介绍在学习了Python之后可以用它来做什么。
  也就是说,《Programming Python》这本基于应用的图书选择了本书所省略的话题,介绍了Python在Web、图形用户界面(GUI)和数据库这样的常用领域的作用。此外,《Python Pocket Reference》一书提供了本书所没有的额外参考资料,可将它作为本书的补充。
  划之初就力求向读者展示比众多程序员初次学习这门语言的时候更深层次的话题。并且,本书基于一个带有测试和练习的3天的Python培训课程,所以可以作为该语言的一个自学教程。
关于第4版
  本书第4版从以下3个方面做出了修改:
  覆盖了Python 3.0和Python 2.6,本书强调Python 3.0,但是对Python 2.6中的不同之处给出了提示。
  包含了一些新的章节,主要介绍高级的核心语言话题。
  重新组织了一些已有的材料,并且使用新的示例扩展它们以便更清楚。
  我在2009年撰写本书这一版时,Python分为两支——Python 3.0是新兴的版本并且不兼容地修改了该语言;Python 2.6保持与大量已有的Python代码向后兼容。尽管Python 3被视作是Python的未来,Python 2仍然使用广泛并且会在未来的几年内与Python 3并列地得到支持。 尽管只是同一种语言的不同版本,但Python 3.0几乎无法运行为之前版本编写的代码(单单print从语句修改为函数,听上去更合理,但是,它几乎影响到所有已经编写好的Python程序)。
  版本的划分使得程序员和图书作者都陷入了两难的境地。尽管编写一本好像Python 2不存在而只介绍Python 3的图书很容易,但这可能无法满足大量基于已有代码的Python用户的需求。大量已有代码都是针对Python 2编写的,并且它们不会很快过时。尽管现在的初学者更关注Python 3,但如果他们必须使用过去编写的代码,那么就必须熟悉Python 2。所有的第三方库和扩展都移植到Python 3可能还需要数年时间,所以Python 2这一分支可能不完全是临时性的。
覆盖Python 3.0和Python 2.6
  为了解决这一分歧并且满足所有潜在读者的需求,本书的这一版更新为覆盖Python 3.0和Python 2.6(以及Python 3.X和Python 2.X系列的后续发布)。本书针对使用Python 2编程的程序员、使用Python 3的程序员,以及介于这二者之间的程序员。
  也就是说,你可以使用本书来学习任何的Python版本。尽管这里主要关注Python 3.0,但Python 2.6的不同之处和工具也都针对使用旧代码的程序员给出了提示。尽管这两个版本大部分是相同的,但它们还是在一些重要的方面有所不同,对此我将指出两者的区别。
  例如,在大多数示例中,我们使用Python 3.0的print调用,但是,我也将介绍Python 2.6的print语句,以便使你能够理解较早的代码。我还广泛地介绍了新功能,例如Python 3.0中的nonlocal语句和Python 2.6以及Python 3.0中的字符串的format方法,当较早的Python中没有这样的扩展时,我将会指出来。
  如果你初次学习Python并且不需要使用任何遗留代码,我鼓励你从Python 3.0开始,它清理了这一语言中长久以来的一些瑕疵,同时保留了所有最初的核心思想并且添加了一些漂亮的新工具。
  当你阅读本书时,很多流行的Python库和工具可能也支持Python 3.0了,特别是在未来的Python 3.1版本中,可以预期文件I/O性能会有较大的提升。如果你使用基于Python 2.X的一个系统,将会发现本书解决了你所关心的问题,并且将帮助你在未来过渡到Python 3.0。
  此外,本版也介绍了其他的Python 2和Python 3的发布版本,尽管一些旧的Python 2.X代码可能无法运行本书的所有示例。例如,尽管在Python 2.6和Python 3.0中都有类装饰器,但我们无法在还没有这一功能的旧Python 2.X中使用它。参见前言中的表0-1和表0-2,它们概括了Python 2.6和Python 3.0中的变化。
  注意: 就在付梓前不久,本书中还添加了关于未来的Python 3.1版的一些突出的扩展的提示,如:字符串format方法调用中的逗号分隔符和自动字段编号、with语句中的多环境管理器语法、针对数字的新方法等。由于Python 3.1的主要目标是优化,本书也直接应用这一新发布。事实上,由于Python 3.1在Python 3.0后接踵而来,并且最新的Python通常是最好的可用Python,在本书中,术语“Python 3.0”通常指的是Python 3.0引入的但在整个Python 3.X版本中都将存在的语言变化。
新增章
  尽管本版的主要目标是针对Python 3.0和Python 2.6更新之前的版本的示例和内容,但我们也增加了5章新内容,以介绍新的主题和增加的内容。
  第27章是一个新的类教程,使用更加实际的示例来说明Python面向对象编程的基础知识。
  第36章提供了关于Unicode和字节字符串的详细介绍,并且概括了Python 2.6和Python 3.0中字符串和文件的区别。
  第37章介绍了特性这样的管理属性工具,并且对描述符给出了新的介绍。
  第38章介绍了函数和类装饰器,并且给出了全面的示例。
  第39章介绍了元类,并且将它们与描述符进行了比较和对比。
  第27章针对Python中的类和OOP提供了一个渐进的、按部就班的教程。它基于我在近年所教授的培训课程中已经使用的一个现场展示,但是,为了在本书中使用已经对它进行了修改。该章设计来在比此前的示例更为实际的背景中展示OOP,并且说明类概念如何综合运用于较大的、实用的程序中。我期望它在这里与在实际的课程中一样有效。
  后面新增的4章收录到了本书的最后一个新增部分中,即“高级话题”部分。尽管这些主题从技术上讲都属于核心语言,但不是每个Python程序员都需要深入了解Unicode文本或元类的细节。因此,这4章单独放到了新的部分中,并且正式地作为可选的阅读材料。例如,关于Unicode和二进制数据字符串的细节已经放入到了此部分中,因为大多数程序员使用简单的ASCII字符串,而不需要了解这些主题。类似地,装饰器和元类通常也只是API构建者才感兴趣的专门话题,而不是应用程序员所感兴趣的话题。
  然而,如果你确实使用这些工具,或者使用代码来做这些工作,“高级话题”部分的章节应该能够帮助你掌握其基础知识。此外,这些章的示例包含了学习案例,这些案例把核心语言概念绑定到了一起,并且它们比本书其他部分的示例更充实。由于这个新的部分是可选阅读材料,所以该部分最后只有问答题但没有练习题。
已有内容的修改
  此外,之前版本的一些内容已经重新组织了,或者用新的示例进行了补充。例如多继承,在第30章增加了列出类树的一个新的学习示例;第20章增加了手动实现map和zip的生成器的示例;第31章新增的代码说明了静态方法和类方法;第23章介绍了包相对导入;第29章的示例介绍了_contains_、_bool_和_index_运算符重载方法,以及针对分片和比较的新的重载协议。
  本版还进行了一些结构上的调整以便更清晰。例如,为了融入新的内容和主题,并且为了避免各章主题的重叠,将前5章划分为两部分。这样一来关于运算符重载、作用域和参数、异常语句细节,以及解析和迭代主题就都有了新的独立的章。已有的章内部也进行了一些重新排序,以便更好地介绍主题。
  本版还试图通过一些重新排序来减少一些向后引用,尽管Python 3.0的变化使得在某些情况下不可能这么做。要理解打印和字符串格式化方法,现在必须知道针对函数的关键字参数;要理解字典键列表和键测试,现在必须知道迭代;要使用exec来运行代码,需要能够使用文件对象,等等。顺序阅读可能还是最有意义的,但是一些主题可能需要非线性的跳跃和随机查找。
  总的来说,本版中有几百处修改。前言的下一个小节,记录下了Python中的27处增加和57处修改。实际上,可以说本版变得更加高级,因为Python多少变得更加高级了。针对Python 3.0自身,你最好能自己发现本书中的修改之处,而不是通过这个前言来了解这些修改。
Python 2.6和Python 3.0中的特定语言扩展
  Python 3.0是一种清晰的语言,但是它也是在某些方面更为复杂的一种语言。实际上,它的一些修改似乎假设你必须为了学习Python而已经了解Python。前面的部分概括了Python 3.0中的一些基础知识。随便举个例子,把字典视图包含到一个list调用中的合理性,该问题是难以置信的细微,并且需要实质预测。除了教授Python的基础知识,本书还充当了跨越这些知识鸿沟的桥梁。表0-1列出了本版中介绍的大多数显著的新的语言功能,并且列出了介绍它们的主要的章。
  表0-1:Python2.6和Python 3.0中的扩展
扩展 介绍的章
Python 3.0中的print函数 11
Python 3.0中的nonlocal x,y语句 17
Python 2.6和Python 3.0中的str.format方法 7
Python 3.0中的字符串类型: str用于Unicode文本,bytes用于二进制数据 7、36
Python 3.0中的文本和二进制文件的区别 9、36
Python 2.6和Python 3.0中的类装饰器: @private('age') 31、38
Python 3.0中的新的迭代器: range、map、zip 14、20
Python 3.0中的字典视图: D.keys、D.values、D.items 8、14
Python 3.0中的除法运算符: 余数、/和// 5
Python 3.0中的集合常量: {a, b, c} 5
Python 3.0中的集合解析: {x**2 for x in seq} 4、5、14、20
Python 3.0中的字典解析: {x: x**2 for x in seq} 4、8、14、20
Python 2.6和Python 3.0中的二进制位字符串支持: 0b0101、bin(I) 5
Python 2.6和Python 3.0中的分数类型: Fraction(1, 3) 5
Python 3.0中的函数注解: def f(a:99, b:str)->int 19
Python 3.0中的Keyword-only参数: def f(a, *b, c, **d) 18、20
Python 3.0中的扩展的序列分解: a, *b = seq 11、13
Python 3.0中可用的针对包的相对导入语法: from 23
Python 2.6和Python 3.0中可用的环境管理器: with/as 33、35
Python 3.0中的异常语法修改: raise、except/as、superclass 33、34
Python 3.0中的异常链: raise e2 from e1 33
Python 2.6和Python 3.0中的保留字的变化 11
Python 3.0中的新式类的取消 31
表0-1:Python2.6和Python 3.0中的扩展(续)
扩展 介绍的章
Python 2.6和Python 3.0中的特性装饰符: @property 37
Python 2.6和Python 3.0中的描述符 31、38
Python 2.6和Python 3.0中的元类 31、39
Python 2.6和Python 3.0中的抽象基类支持 28
Python 3.0中特定的语言删除
  除了扩展,还有一些语言工具从Python 3.0中删除了,以清理其设计。表0-2概括了影响到本书的这些变化,以及本版中介绍它们的不同的章。表0-2中列出的很多删除都有直接的替代者,其中的一些在Python 2.6中还可用,以支持未来向Python 3.0的迁移。
表0-2:影响到本书的Python 3.0中的删除
删除的   替代的   介绍的章
reload(M) imp.reload(M)(或exec) 3、22
apply(f, ps, ks) f(*ps, **ks) 18
'X' repr(X) 5
X <> Y X != Y 5
long int 5
9999L 9999 5
D.has_key(K) K in D(或D.get(key) != None) 8
raw_input input 3、10
old input eval(input()) 3
xrange range 14
file open(以及io模块类) 9
X.next X.__next__,由next(X)调用 14、20、29
X.__getslice__ X.__getitem__,传入一个slice对象 7、29
X.__setslice__ X.__setitem__,传入一个slice对象 7、29
reduce functools.reduce(或循环代码) 14、19
execfile(filename) exec(open(filename).read()) 3
exec open(filename) exec(open(filename).read()) 3
0777 0o777 5
print x, y print(x, y) 11
表0-2:影响到本书的Python 3.0中的删除(续)
删除的   替代的   介绍的章
print >> F, x, y print(x, y, file=F) 11
print x, y, print(x, y, end=' ') 11
u'ccc' 'ccc' 7、36
'bbb' for byte strings b'bbb' 7、9、36
raise E,V raise E(V) 32、33、34
except E, X: except E as X: 32、33、34
def f((a, b)): def f(x): (a, b) = x 11、18、20
file.xreadlines for line in file: (or X=iter(file)) 13、14
D.keys()等 list(D.keys())(字典视图) 8、14
map(), range(), etc. list(map()), list(range()) 14
as lists (内置函数)
map(None, ...) zip(或手动代码来补充结果) 13、20
X=D.keys(); X.sort() sorted(D)(或list(D.keys())) 4、8、14
cmp(x, y) (x > y) - (x < y) 29
X.__cmp__(y) __lt__、__gt__、__eq__等 29
X.__nonzero__ X.__bool__ 29
X.__hex__, X.__oct__ X._index__ 29
排序比较函数 使用key=transform或reverse=True 8
Dictionary <, >, <=,  Compare sorted(D.items()) 8、9
>= (或循环代码)
types.ListType list(types只用于非内建名称) 9
__metaclass__ = M class C(metaclass=M): 28、31、39
__builtin__ builtins(重命名) 17
Tkinter tkinter(重命名) 18、19、24、29、30
sys.exc_type、exc_value sys.exc_info()[0], [1] 34、35
function.func_code function.__code__ 19、38
由内置函数运行的 在包装类中重定义__X__方法 30、37、38
__getattr__
-t,__tt命令行切换 不一致地使用制表符/空格总是一个错误 10、12
一个函数中的from ... * 只能够出现在一个文件的顶层 22
导入模块,在同一包中 from . import mod,包相关的形式 23
表0-2:影响到本书的Python 3.0中的删除(续)
删除的   替代的   介绍的章
class MyException: class MyException(Exception): 34
exceptions module 内置作用域,库手册 34
thread、Queue modules _thread, queue 17
(二者都改名了)
anydbm module dbm(改名了) 27
cPickle module _pickle(改名了,自动使用) 9
os.popen2/3/4 subprocess.Popen(os.popen保留) 14
基于字符串的异常 基于类的异常(Python 2.6中也是如此) 32、33、34
字符串模块函数 字符串对象方法 7
未绑定方法 函数(通过实例调用静态方法) 30、31
混合类型比较、排序 非数字的混合类型比较是错误 5、9
  Python 3.0中还有其他的修改没有包含在该表中,只是因为它们没有影响到本书。例如,标准库中的修改,那些修改可能对《Programming Python》这样关注应用程序的图书的影响比对本书的影响要大,尽管很多标准库的功能仍然存在,Python 3.0很大程度地重命名了模块,将它们组织到包中等。要更全面地了解Python 3.0中的变化,可参阅Python的标准手册集中的“What’s New in Python 3.0”文档,其中包含一个更全面的列表。
  如果你正在从Python 2.X迁移到Python 3.X,那么应该看一下Python 3.0中的2到3自动代码转换脚本。它并不能够转换任何内容,但是,它做了合理的工作来把大量的Python 2.X代码转换为在Python 3.X下可运行的代码。在我编写本书时,一个新的3到2的反向转换项目也在进行之中,它可以把Python 3.X代码转换为在Python 2.X下运行。如果你必须针对两个Python系列版本维护代码的话,这两种工具都很有用,想深入了解可参见Web上的详细介绍。
关于本书
  本部分强调了本书的一般性重点,和本书的版本无关。没有哪本书可以满足每一位潜在的读者,所以阅读之前了解本书的写作目的是很重要的。
事前准备
  事实上,阅读本书确实没有什么绝对的先决条件。初学者和功底深厚的编程高手都可以从容地阅读本书。如果打算学习Python,本书可能很适合你。如果你曾有过编程或编写脚本的经验,那么会对你阅读本书有一点帮助。但是,并不要求每位读者都得这样。
  本书设计为程序员注1学习Python的入门书籍。对于那些从来没有接触过计算机的人,可能就不适合了(例如,我不会花时间讨论计算机是什么)。但是,这并不意味你需要有编程的经历。
  另一方面,我不会假设读者什么都不懂而冒犯了读者:使用Python来做有意义的事,这很容易,而本书就是要教读者怎样做。本书有时会用Python和C、C++、Java以及Pascal语言来做比较,但是如果读者过去没有使用过这些语言,则完全可以放心地忽略这些比较。
本书的范围和其他书籍
  虽然本书涵盖了Python语言所有的基本内容,但基于速度和篇幅的考虑,我还是把本书的范围缩小了。为了让事情简单化,本书关注核心概念,使用小并且独立完备的例子来示范重点知识,并且有时省略了可以在参考手册中找到的细节。因此,把本书当作通往更高级应用的垫脚石和完整的入门书籍再好不过了。
  例如,我们不会谈论太多的Python/C集成,这个复杂话题显然是许多基于Python的系统的核心。我们也不会谈论太多Python的历史或发展过程。对于流行的Python应用程序也只简单浏览而已,例如,GUI、系统工具以及网络脚本机制,而有的则根本不提。显然,这会漏掉整体内容的一部分。
  从整体上来说,Python是为了让脚本的质量等级再提升几个级别。而Python的有些观念需要的背景环境,不是这里所能提供的,如果没有推荐读者读完此书后进行更深入的学习,那就是我的疏忽了。我希望本书的绝大多数读者最终都可以继续走下去,从其他书籍完整了解应用层面的编程技术。
  因为本书关注的是初学者,设计上自然是和O扲eilly的其他Python书籍互补。例如,我编写的另一本书《Programming Python》,提供更大并且更完整的例子,还有应用程序编程技巧的教程,而且我有意将其设计为读完此书后的后续书籍。概括地说,本书的目前版本和《Programming Python》反映了作者培训内容的两部分:核心语言和应用程序程序设计。此外,O扲eilly的《Python Pocket Reference》也是搜索本书忽略的一些细节的快速参考手册。
  其他后续的书籍也可提供参考、附加的例子或者于特定领域中(例如,Web开发和GUI)使用Python的细节。例如,O扲eilly的《Python in a Nutshell》以及Sams的《Python Essential Reference》提供了有用的参考,而O扲eilly的《Python Cookbook》则为那些已熟知应用程序设计技巧的人提供了独立完备的例子。因为别人对书籍的评价是很主观的,建议读者亲自浏览这些书,来选择满足自己需求的进阶书籍。不过,无论选择哪本书,要记住,Python其余内容所需学习的例子都相当实际,以至于这里没有空间能够容纳。
  尽管这么说,我想读者还是会发现本书是学习Python的首选书籍,虽然范围有限(也许也正是因为如此)。你会学到初学阶段编写独立的Python程序和脚本所需要的一切。当你读完本书时,不仅学习了语言本身,也会学到如何将其合理地运用于日常工作中。此外,当读者遇到更高级的主题和例子时,将会有足够的能力去解决它们。
本书的风格和结构
  本书是基于为期3天的Python课程的培训材料编写而成的。每章末尾有本章对应的习题,并且在每部分最后一章末尾有本部分对应的练习题。习题和练习题的解答在附录B中给出。习题可以帮助读者复习学过的内容,而练习题可以帮助读者以正确的方式编写代码,而且这通常也是该课程的重点之一。
  强烈建议做一下习题和练习题,不仅是为了积累Python编程的经验,也是因为有些练习题会引出本书没有涉及的主题。如果碰上难题,附录B的解答应该可以帮助你(而且我也鼓励你尽量地阅读那些解答)。
  本书的整体结构也是来自于课程的培训材料。因为本书是用来快速介绍语言的基础的,所以以语言的主要功能进行组织并介绍,而不是以例子为主。这里采用了由下至上的手法:从内置对象类型,到语句,再到程序单元等。每章都比较完备,但是后续的章节会利用到前面章节所介绍的概念(例如,谈到类时,我假定你已经知道如何编写函数),所以对多数读者来说,循序渐进应该是最合理的阅读方法。
  一般来说,本书用由下至上的方式介绍Python语言,一个部分介绍一种主要语言功能(类型以及函数等),并且多数例子都很小,它们都是独立完备的(有些人可能会说本书的例子显得空洞,但是,这些例子都是为了说明知识点而设计的)。具体来说,本书内容如下。
第一部分,使用入门
  我们以概览Python作为开始,回答了一些常见的问题:为什么要使用这门语言、它有什么用处等。第1章介绍这门技术背后的主要思想,以及历史背景。然后,介绍本书技术方面的内容,我们会探索Python运行程序的方式。介绍这一部分的目标是让读者有足够的知识,可以跟上后面的例子和练习题的步伐。
第二部分,类型和运算
  接着,我们开始Python语言之旅,深入研究Python的主要内置对象类型:数字、列表和字典等。使用这些工具,就可以用Python做很多事了。这是本书最重要的一部分,因为这部分内容是学习后续章节的基础。我们也会在此部分谈到动态定型和其引用值:这是掌握Python的关键。
第三部分,语句和语法
  本部分开始介绍Python的语句:输入的代码会在Python中创建并处理对象。此外,本部分也会介绍Python的一般语法模型。虽然这一部分的重点是语法,但也会介绍相关的工具。例如,PyDoc系统,并探索其他一些编写代码的方法。
第四部分,函数
  在这一部分开始讨论Python的更高层次的程序结构工具。函数是为重用而打包代码并避免代码冗余的简单方式。在这一部分内容中,我们将会探索Python的作用域法则、参数传递等技术。
第五部分,模块
  Python模块把语句和函数组织成更大的组件,而这一部分会说明如何创建、使用并重载模块。我们也会在这里看到一些更高级的主题,例如,模块包、模块重载以及_name_变量。
第六部分,类和OOP
  在一部分,我们探索了Python的面向对象编程(OOP)工具——类。类是选用的,但却是组织代码来定制和重用的强大工具。读者将会看到,类几乎是重复利用在本书中谈到的概念,而Python的OOP多数就是在链接的对象中查找变量名。读者也会了解到,OOP在Python中是选用的,但是可以帮助减少大量的开发时间,尤其是对长期的策略性项目开发来说更是如此。
第七部分,异常和工具
  本书介绍语言基础的最后一部分,讨论Python异常处理模型和语句,加上对开发工具的简介(当读者开始编写较大的程序时,工具就会变得更实用。例如,调试和测试工具)。尽管异常是相当轻量级的工具,这一部分放在类介绍之后,是因为异常现在应该都是类了。
第八部分,高级话题(第4版新增部分,请到华章网站下载)
  在最后一部分中,我们介绍了一些高级话题。这里,我们学习了Unicode和字节字符串、特性和描述符这样的管理属性工具、函数和类装饰器,以及元类。这些章都是选读的,因为并不是所有的程序员都需要理解这些章所介绍的话题。另一方面,必须处理国际化文本或二进制数据的读者,或者负责开发API供其他程序员使用的读者,应该会对本部分感兴趣。
第九部分,附录(附录内容请到华章网站下载)
  本书结尾是两个附录,介绍了在各种计算机上使用Python的与平台相关的技巧(附录A),并提供了每章结尾习题和每部分末尾的练习题的解答(附录B)。
  注意:索引和目录可用于查找细节,但本书没有参考文献附录(本书是教程,而不是参考书)。就像之前提到的一样,读者可以参考《Python Pocket Reference》(O扲eilly)还有其他书籍,以及免费的Python参考手册(参看http://www.python.org)来了解语法和内置工具的细节。
书籍更新
  本书在不断地进行完善(输入错误也包括在内)。本书原版的更新、补充以及更正会在下列任一网站进行更新维护。
  http://www.oreilly.com/catalog/9780596158064/(O扲eilly的本书的网页)
  http://www.rmi.net/~lutz(作者的网站)
  http://www.rmi.net/~lutz/about-lp.html(作者的关于本书的网页)
  这三个URL中的最后一个是关于本书的网页,我会在此发布更新,如果链接失效了,一定要进行Web搜索。如果我更有洞察力,我会尽力,但网页的修改比印刷书籍要快得多。
关于本书的程序
  书中所有程序的例子都是基于Python 3.0版的。此外,这些例子中的大多数都能在Python 2.6下运行,正如本书所提到的,Python 2.6读者的注意事项也会在其中给出提示。
  然而,因为本书的重点是核心语言,可以相当肯定,多数内容在Python以后的版本中不会有太多的变化。本书多数内容也适用于早期的Python版本。当然,如果读者尝试使用在其所用版本之后增加的扩展功能,那当然行不通了。
  原则就是,最新的Python就是最好的Python。因为本书重点是核心语言,多数内容也适用第2章提到的Jython(基于Java的Python语言实现)以及其他Python的实现。
  本书例子的源代码以及练习题的解答都可从本书网站获取:http://www.oreilly.com/catalog/9780596158064/。那么读者该怎样运行例子呢?本书会在第3章介绍运行的细节。
使用代码示例
  本书的目的是帮助读者把工作做好。一般来说,读者可以在程序和文档中使用本书的代码,不需要联系我们取得许可,除非是要重新发布大量的代码。例如,编写程序时,使用本书好几段代码,不需要许可。销售和分发O扲eilly范例光盘需要许可。引用本书和例子程序来回答问题,不需要许可。把本书大量例子程序整合到自己的产品文档中则需要许可。
  虽然并非必须,但我们会感谢那些标明所有权的行为。所有权通常包括标题、作者、出版社和ISBN。例如,“Learning Python, Fourth Edition, by Mark Lutz. Copyright 2009 Mark Lutz, 978-0-596-15806-4”。
  如果读者觉得对程序例子的运用超出合理使用或者上列许可情况之外,可以与我们联系:permissions@oreilly.com。
体例
  下面是本书关于印刷字体方面的一些约定:
  斜体(Italic)
  用于电子信箱、URL、文件名、路径名以及用于强调第一次介绍的新的术语。
  等宽字体(Constant width)
  用于文件内容以及命令输出,来表示模块、方法、语句以及命令。
  等宽粗体(Constant width bold)
  用于程序代码段,来显示应该由用户输入的命令或文字,有时则用于强调程序代码的一部分。
  等宽斜体(Constant width italic)
  用于程序代码段中可替换的部分以及一些注释。
  <等宽字体>(
  表示应该以真实程序代码取代的语法单元。
  注意: 表示和附近文字相关的技巧、建议或一般性注释。
  警告: 表示和附近文字相关的警告和注意事项。
  注意: 本书例子中,系统命令行开头的%字符指的是系统提示符,这取决于读者的机器(例如,DOS窗口是C:\Python30>)。不要自行输入%字符(或者有时候它表示的系统提示)。
  同样,在解释器交互模式下所列出的内容中,也不要输入每行开头的>>>和...字符,这些是Python显示的提示符。只要输入这些提示符之后的文字就行了。为了帮助你记住这一点,本书中的用户输入都将以粗体显示。
  此外,一般也不需要输入程序清单中以#开头的文字,这些是注释,不是可执行的代码。
联系我们
  有关本书的任何建议和疑问,可以与下面的出版社联系:
  美国:
  O'Reilly Media, Inc.
  1005 Gravenstein Highway North
  Sebastopol, CA 95472
  中国:
  北京市西城区西直门南大街2号成铭大厦C座807室(100035)
  奥莱利技术咨询(北京)有限公司
  我们为本书提供了一个网页,其中给出了勘误表、示例和所有的附加信息。可以通过以下地址访问该网页:
  http://www.oreilly.com/catalog/9780596158064
  要对本书发表评论或询问技术问题,请发电子邮件到:
  bookquestions@oreilly.com
  有关我们的书籍、会议、资源中心以及O扲eilly网络,可以访问我们的网站:
  http://www.oreilly.com
  http://www.oreilly.com.cn
致谢
  当我在2009年写本书第4版时,我总是抱着某种“完成任务”的心态。我已经使用并推广Python 17年了,而且也已经有12年Python的培训经验了。尽管时间在不断流逝,我依然惊讶于Python这些年来取得的成功。Python的成长,是我们多数人在1992年时难以想象的。所以,也许我得冒着被当成无可救药、固执己见的作者的风险,但是请你谅解一下,我得在这里说一说回忆、恭贺以及感谢的话。
  这是漫长而崎岖的道路。今日回首,1992年当我第一次发现Python的时候,我根本不知道它对我未来17年的生活会有什么影响。1995年编写《Programming Python》第一版后的两年,我开始在全国和全世界旅行,为初学者和专家培训Python。从1999年完成本书第一版后,我成为了全职、独立的Python培训师和作家,这得益于Python指数级增长的受欢迎程度。
  我在2009年中写下这些话时,已经编写了12本Python书籍(3本是第4版);我培训Python已经超过10年了,而且在美国、欧洲、加拿大以及墨西哥教过225个Python短期培训课程,在此过程中遇到了超过3000位以上的学生。除了频繁地累计飞行里程,这些课程也帮助我精炼本书以及其他Python书籍的内容。几年下来,教学磨炼了书籍,而书籍又反过来磨炼了教学。事实上,你读的这本书的大部分内容都源于我的课程。
因此,我想要感谢过去12年来参加我培训的所有学生。除了Python本身的变化之外,你们的反馈对本书的出版,也扮演了重要角色(没有比看3 000位学生重复犯初学者的错误更有启发性的事了)。本版主要根据2003年后的课程进行修正,不过,从1997年起的每堂课,都对本书的精炼有或多或少的帮助。我要特别感谢那些在都柏林、墨西哥城、巴塞罗那、伦敦、埃德蒙顿以及波多黎各举办课程的那些客户,无法想象有比这更好的培训地点了。
  我也想对每一位参与本书制作的人表示感谢。参与这个项目的编辑:这一版的Julie Steele 、前一版的Tatiana Apandi,以及前几版的许多人。感谢Doug Hellmann和Jesse Noller参与本书的技术校对。感谢O扲eilly让我有这个机会写出这12本书;真的很有趣(感觉上有点像电影《偷天情缘(Groundhog Day)》)。
  感谢最初的共同作者David Ascher对本书前两版的帮助。David在前几版中贡献了“外层”部分,但是从第3版开始,为了让新的核心语言素材多一点空间,我们不得不忍痛割爱了。我在本版中加了一些更高级的实例和一个全新的高级主题部分作为弥补。请参见本前言前面对于后续应用级内容的说明,一旦你学习了基础知识之后,可能想要学习这些应用级内容。
  特别感谢Guido van Rossum和Python社区的人们创造了如此有趣和实用的语言。就像多数开源系统一样,Python是许多英雄努力的结果。拥有了17年的Python编程经验,我依然觉得Python相当有趣。我特别荣幸看到了Python从脚本语言的初级阶段成长为广泛使用的工具,几乎每个编写软件的组织都以某种方式在部署使用它。这是令人兴奋的结果,我想感谢并祝贺整个Python社区,你们做了件很美妙的事。
  我也想感谢O扲eilly公司我最初的编辑:已故的Frank Willison。本书大部分都是Frank的想法,反映出他那充满感染力的愿景。回首往事,Frank对我的职业生涯以及Python本身都有很深远的影响。Python刚出现时拥有这么多的乐趣并如此成功,可以说,这都归功于Frank,一点都不夸张。我们还是很想念他。
  最后,还有些人要感谢。感谢OQO这么好的玩具。感谢已故的Carl Sagan,让来自威斯康星州的18岁小伙子得到了启发。感谢我的妈妈给予我鼓励。感谢我这几年遇到的所有大型公司,提醒我自己有多么幸运,可以为自己打工。
  感谢我的孩子Mike、Sammy以及Roxy,无论他们将来选择做什么。我开始用Python时,你们都还小,而你们似乎也这样长大了,我以你们为荣。生活会让我们一路走下去,但是总会有回家的路。
  最需要感谢的是Vera,我最好的朋友、女友以及妻子。我最美妙的日子就是我终于遇见你的那一天。我不知道接下来50年会怎样,但我知道,我想把所有时间都用来拥抱你。
Mark Lutz
佛罗里达州萨拉索市
2009年7月
前言 1
第一部分 使用入门
第1章 问答环节 19
人们为何使用Python 19
软件质量 20
开发效率 21
Python是“脚本语言”吗 21
好吧,Python的缺点是什么呢 23
如今谁在使用Python 23
使用Python可以做些什么 24
系统编程 25
用户图形接口 25
Internet脚本 25
组件集成 26
数据库编程 26
快速原型 27
数值计算和科学计算编程 27
游戏、图像、人工智能、XML、机器人等 27
Python如何获得支持 28
Python有哪些技术上的优点 28
面向对象 28
免费 29
可移植 29
功能强大 30
可混合 31
简单易用 31
简单易学 32
Python和其他语言比较起来怎么样 32
本章小结 33
本章习题 33
习题解答 34
Python是工程,不是艺术 34
第2章 Python如何运行程序 36
Python解释器简介 36
程序执行 37
程序员的视角 37
Python的视角 39
执行模块的变体 41
Python实现的替代者 42
执行优化工具 43
冻结二进制文件 44
其他执行选项 45
未来的可能性 46
本章小结 46
本章习题 47
习题解答 47
第3章 如何运行程序 48
交互提示模式下编写代码 48
交互地运行代码 49
为什么使用交互提示模式 51
使用交互提示模式 52
系统命令行和文件 54
第一段脚本 55
使用命令行运行文件 56
使用命令行和文件 57
UNIX可执行脚本(#!) 58
UNIX env查找技巧 59
点击文件图标 60
在Windows中点击图标 60
input的技巧 61
图标点击的其他限制 63
模块导入和重载 63
模块的显要特性:属性 65
import和reload的使用注意事项 68
使用exec运行模块文件 69
IDLE用户界面 70
IDLE基础 71
使用IDLE 72
高级IDLE工具 74
其他的IDE 74
其他启动选项 76
嵌入式调用 76
冻结二进制的可执行性 77
文本编辑器启动的选择 77
其他的启动选择 77
未来的可能 77
我应该选用哪种 78
调试Python代码 78
本章小结 80
本章习题 80
习题解答 80
第一部分 练习题 81
第二部分 类型和运算
第4章 介绍Python对象类型 87
为什么使用内置类型 88
Python的核心数据类型 88
数字 90
字符串 92
序列的操作 92
不可变性 94
类型特定的方法 94
寻求帮助 96
编写字符串的其他方法 97
模式匹配 98
列表 98
序列操作 98
类型特定的操作 99
边界检查 100
嵌套 100
列表解析 101
字典 103
映射操作 103
重访嵌套 104
键的排序:for 循环 105
迭代和优化 107
不存在的键:if 测试 107
元组 109
为什么要用元组 109
文件 110
其他文件类工具 111
其他核心类型 111
如何破坏代码的灵活性 113
用户定义的类 114
剩余的内容 115
本章小结 115
本章习题 116
习题解答 116
第5章 数字 117
Python的数字类型 117
数字常量 118
内置数学工具和扩展 119
Python表达式操作符 120
在实际应用中的数字 125
变量和基本的表达式 125
数字显示的格式 126
比较:一般的和连续的 127
str和repr显示格式 128
除法: 传统除法、Floor除法和真除法 129
整数精度 133
复数 133
十六进制、八进制和二进制记数 134
位操作 136
其他的内置数学工具 137
其他数字类型 139
小数数字 139
分数类型 141
集合 145
布尔型 151
数字扩展 152
本章小结 153
本章习题 153
习题解答 153
第6章 动态类型简介 155
缺少类型声明语句的情况 155
变量、对象和引用 156
类型属于对象,而不是变量 157
对象的垃圾收集 158
共享引用 159
共享引用和在原处修改 161
共享引用和相等 163
动态类型随处可见 164
本章小结 165
本章习题 165
习题解答 165
第7章 字符串 167
字符串常量 169
单双引号字符串是一样的 170
用转义序列代表特殊字节 171
raw字符串抑制转义 173
三重引号编写多行字符串块 175
实际应用中的字符串 176
基本操作 176
索引和分片 177
为什么要在意:分片 181
字符串转换工具 181
修改字符串 184
字符串方法 185
字符串方法实例:修改字符串 187
字符串方法实例:文本解析 189
实际应用中的其他常见字符串方法 190
最初的字符串模块(在Python 3.0中删除) 191
字符串格式化表达式 192
更高级的字符串格式化表达式 194
基于字典的字符串格式化 196
字符串格式化调用方法 196
基础知识 197
添加键、属性和偏移量 198
添加具体格式化 198
与%格式化表达式比较 200
为什么用新的格式化方法 203
通常意义下的类型分类 206
同样分类的类型共享其操作集合 206
可变类型能够在原处修改 207
本章小结 208
本章习题 208
习题解答 208
第8章 列表与字典 210
列表 210
实际应用中的列表 213
基本列表操作 213
列表迭代和解析 213
索引、分片和矩阵 214
原处修改列表 215
字典 220
实际应用中的字典 222
字典的基本操作 222
原处修改字典 223
其他字典方法 224
语言表 225
字典用法注意事项 226
为什么要在意字典接口 229
创建字典的其他方法 230
Python 3.0中的字典变化 231
本章小结 237
本章习题 237
习题解答 237
第9章 元组、文件及其他 239
元组 239
实际应用中的元组 241
为什么有了列表还要元组 243
文件 243
打开文件 244
使用文件 245
实际应用中的文件 246
其他文件工具 252
重访类型分类 254
为什么要在意操作符重载 255
对象灵活性 255
引用 VS 拷贝 256
比较、相等性和真值 258
Python 3.0的字典比较 260
Python中真和假的含义 261
Python的类型层次 263
Type对象 263
Python中的其他类型 265
内置类型陷阱 265
赋值生成引用,而不是拷贝 265
重复能够增加层次深度 266
留意循环数据结构 266
不可变类型不可以在原处改变 267
本章小结 267
本章习题 268
习题解答 268
第二部分练习题 269
第三部分 语句和语法
第10章 Python语句简介 275
重访Python程序结构 275
Python的语句 276
两个if的故事 278
Python增加了什么 279
Python删除了什么 279
为什么使用缩进语法 281
几个特殊实例 283
简短实例:交互循环 285
一个简单的交互式循环 285
对用户输入数据做数学运算 287
用测试输入数据来处理错误 288
用try语句处理错误 289
嵌套代码三层 290
本章小结 290
本章习题 291
习题解答 291
第11章 赋值、表达式和打印 292
赋值语句 292
赋值语句的形式 293
序列赋值 294
Python 3.0中的扩展序列解包 297
多目标赋值语句 301
增强赋值语句 302
变量命名规则 305
Python的废弃协议 306
表达式语句 308
表达式语句和在原处的修改 309
打印操作 310
Python 3.0的print函数 311
Python 2.6 print语句 313
打印流重定向 315
版本独立的打印 318
为什么要注意print和stdout 319
本章小结 320
本章习题 321
习题解答 321
第12章 if测试和语法规则 322
if语句 322
通用格式 322
基本例子 323
多路分支 323
Python语法规则 325
代码块分隔符 326
语句的分隔符 328
一些特殊情况 329
真值测试 330
if/else三元表达式 332
为什么要在意布尔值 334
本章小结 335
本章习题 335
习题解答 335
第13章 while和for循环 336
while循环 336
一般格式 336
例子 337
break、continue、pass和循环else 338
一般循环格式 338
pass 338
continue 340
break 340
循环else 341
为什么要在意“模拟C 语言的while循环” 342
for循环 343
一般格式 343
例子 344
为什么要在意“文件扫描” 349
编写循环的技巧 350
循环计数器:while和range 351
非完备遍历:range和分片 352
修改列表:range 353
并行遍历:zip和map 354
产生偏移和元素:enumerate 357
本章小结 358
本章习题 358
习题解答 359
第14章 迭代器和解析,第一部分 360
迭代器:初探 360
文件迭代器 361
手动迭代:iter和next 363
其他内置类型迭代器 365
列表解析:初探 367
列表解析基础知识 368
在文件上使用列表解析 369
扩展的列表解析语法 370
其他迭代环境 371
Python 3.0中的新的可迭代对象 375
range迭代器 376
map、zip和filter迭代器 377
多个迭代器 VS单个迭代器 378
字典视图迭代器 379
其他迭代器主题 381
本章小结 381
本章习题 381
习题解答 382
第15章 文档 383
Python文档资源 383
#注释 384
dir函数 384
文档字符串:__doc__ 385
PyDoc:help函数 388
PyDoc:HTML报表 390
标准手册集 393
网络资源 394
已出版的书籍 394
常见编写代码的陷阱 395
本章小结 397
本章习题 397
习题解答 397
第三部分练习题 398
第四部分 函数
第16章 函数基础 403
为何使用函数 404
编写函数 405
def语句 406
def语句是实时执行的 407
第一个例子:定义和调用 408
定义 408
调用 408
Python中的多态 409
第二个例子:寻找序列的交集 410
定义 410
调用 411
重访多态 411
本地变量 412
本章小结 413
本章习题 413
习题解答 413
第17章 作用域 415
Python作用域基础 415
作用域法则 416
变量名解析:LEGB原则 418
作用域实例 419
内置作用域 420
在Python 2.6中违反通用性 422
global语句 422
最小化全局变量 423
最小化文件间的修改 424
其他访问全局变量的方法 426
作用域和嵌套函数 427
嵌套作用域的细节 427
嵌套作用域举例 427
nonlocal语句 433
nonlocal基础 433
nonlocal应用 435
为什么使用nonlocal 437
本章小结 440
本章习题 441
习题解答 442
第18章 参数 444
传递参数 444
参数和共享引用 445
避免可变参数的修改 447
对参数输出进行模拟 448
特定的参数匹配模型 449
基础知识 449
匹配语法 450
细节 452
关键字参数和默认参数的实例 452
任意参数的实例 455
Python 3.0 Keyword-Only参数 459
min调用 462
满分 463
加分点 464
结论 465
一个更有用的例子:通用set函数 465
模拟Python 3.0 print函数 466
使用Keyword-Only参数 467
为什么要在意:关键字参数 469
本章小结 469
本章习题 470
习题解答 470
第19章 函数的高级话题 472
函数设计概念 472
递归函数 474
用递归求和 474
编码替代方案 475
循环语句VS递归 476
处理任意结构 477
函数对象:属性和注解 478
间接函数调用 478
函数内省 479
函数属性 480
Python 3.0中的函数注解 481
匿名函数: lambda 483
lambda表达式 483
为什么使用lambda 484
如何(不要)让Python代码变得晦涩难懂 486
嵌套lambda和作用域 487
为什么要在意:回调 488
在序列中映射函数:map 489
函数式编程工具:filter和reduce 490
本章小结 492
本章习题 492
习题解答 492
第20章 迭代和解析,第二部分 494
回顾列表解析:函数式编程工具 494
列表解析与map 495
增加测试和嵌套循环 496
列表解析和矩阵 498
理解列表解析 499
为什么要在意:列表解析和map 500
重访迭代器:生成器 501
生成器函数:yield VS return 502
生成器表达式:迭代器遇到列表解析 506
生成器函数 VS 生成器表达式 507
生成器是单迭代器对象 508
用迭代工具模拟zip和map 510
为什么你会留意:单次迭代 514
内置类型和类中的值生成 515
Python 3.0解析语法概括 516
解析集合和字典解析 517
针对集合和字典的扩展的解析语法 517
对迭代的各种方法进行计时 518
对模块计时 519
计时脚本 519
计时结果 520
计时模块替代方案 523
其他建议 527
函数陷阱 528
本地变量是静态检测的 528
默认和可变对象 529
没有return语句的函数 531
嵌套作用域的循环变量 532
本章小结 532
本章习题 532
习题解答 533
第四部分练习题 533
第五部分 模块
第21章 模块:宏伟蓝图 539
为什么使用模块 540
Python程序架构 540
如何组织一个程序 541
导入和属性 541
标准库模块 543
import如何工作 543
1.搜索 544
2.编译(可选) 544
3.运行 545
模块搜索路径 545
配置搜索路径 547
搜索路径的变动 548
sys.path列表 548
模块文件选择 549
高级的模块选择概念 550
第三方工具:distutils 550
本章小结 551
本章习题 551
习题解答 551
第22章 模块代码编写基础 553
模块的创建 553
模块的使用 554
import语句 554
from语句 555
from *语句 555
导入只发生一次 555
import和from是赋值语句 556
文件间变量名的改变 557
import和from的对等性 557
from语句潜在的陷阱 558
模块命名空间 560
文件生成命名空间 560
属性名的点号运算 562
导入和作用域 562
命名空间的嵌套 563
重载模块 564
reload基础 565
reload实例 566
为什么要在意:模块重载 567
本章小结 568
本章习题 568
习题解答 568
第23章 模块包 570
包导入基础 570
包和搜索路径设置 571
__init__.py包文件 572
包导入实例 573
包对应的from语句和import语句 574
为什么要使用包导入 575
三个系统的传说 576
包相对导入 578
Python 3.0中的变化 578
相对导入基础知识 579
为什么使用相对导入 581
相对导入的作用域 583
模块查找规则总结 583
相对导入的应用 584
为什么要在意:模块包 589
本章小结 590
本章习题 590
习题解答 590
第24章 高级模块话题 592
在模块中隐藏数据 592
最小化from *的破坏:_X和__all__ 593
启用以后的语言特性 593
混合用法模式:__name__和__main__ 594
以__name__进行单元测试 595
使用带有__name__的命令行参数 596
修改模块搜索路径 599
Import语句和from语句的as扩展 599
模块是对象:元程序 600
用名称字符串导入模块 603
过渡性模块重载 604
模块设计理念 607
模块陷阱 607
顶层代码的语句次序的重要性 608
from复制变量名,而不是连接 609
from *会让变量语义模糊 610
reload不会影响from导入 610
reload、from以及交互模式测试 611
递归形式的from导入无法工作 612
本章小结 613
本章习题 613
习题解答 613
第五部分练习题 614
第六部分 类和OOP
第25章 OOP:宏伟蓝图 619
为何使用类 620
概览OOP 621
属性继承搜索 621
类和实例 623
类方法调用 624
编写类树 624
OOP是为了代码重用 627
本章小结 629
本章习题 629
习题解答 630
第26章 类代码编写基础 631
类产生多个实例对象 631
类对象提供默认行为 632
实例对象是具体的元素 632
第一个例子 632
类通过继承进行定制 635
第二个例子 635
类是模块内的属性 637
类可以截获Python运算符 638
第三个例子 639
为什么要使用运算符重载 641
世界上最简单的Python类 641
类与字典的关系 644
本章小结 646
本章习题 646
习题解答 646
第27章 更多实例 649
步骤1:创建实例 650
编写构造函数 650
在进行中测试 651
以两种方式使用代码 652
版本差异提示 654
步骤2:添加行为方法 654
编写方法 656
步骤3:运算符重载 658
提供打印显示 658
步骤4:通过子类定制行为 659
编写子类 660
扩展方法:不好的方式 660
扩展方法:好的方式 661
多态的作用 663
继承、定制和扩展 664
OOP:大思路 664
步骤5:定制构造函数 665
OOP比我们认为的要简单 666
组合类的其他方式 667
在Python 3.0中捕获内置属性 669
步骤6:使用内省工具 670
特殊类属性 670
一种通用显示工具 671
实例与类属性的关系 672
工具类的命名考虑 673
类的最终形式 674
步骤7(最后一步):把对象存储到数据库中 676
Pickle和Shelve 676
在shelve数据库中存储对象 677
交互地探索shelve 678
更新shelve中的对象 680
未来方向 681
本章小结 683
本章习题 684
习题解答 684
第28章 类代码编写细节 686
class语句 686
一般形式 686
例子 687
方法 689
例子 690
调用超类构造函数 691
其他方法调用的可能性 691
继承 692
属性树的构造 692
继承方法的专有化 693
类接口技术 694
抽象超类 695
Python 2.6和Python 3.0的抽象超类 696
命名空间:完整的内容 698
简单变量名:如果赋值就不是全局变量 698
属性名称:对象命名空间 698
Python命名空间的“禅”:赋值将变量名分类 699
命名空间字典 701
命名空间链接 704
回顾文档字符串 706
类与模块的关系 707
本章小结 708
本章习题 708
习题解答 708
第29章 运算符重载 710
基础知识 710
构造函数和表达式:__init__和__sub__ 711
常见的运算符重载方法 711
索引和分片:__getitem__和__setitem__ 713
拦截分片 713
Python 2.6中的分片和索引 715
索引迭代:__getitem__ 716
迭代器对象:__iter__和__next__ 717
用户定义的迭代器 717
有多个迭代器的对象 719
成员关系:__contains__、__iter__和__getitem__ 721
属性引用:__getattr__和__setattr__ 723
其他属性管理工具 725
模拟实例属性的私有性:第一部分 725
__repr__和__str__会返回字符串表达形式 726
右侧加法和原处加法:__radd__和__iadd__ 729
原处加法 730
Call表达式:__call__ 731
函数接口和回调代码 732
比较:__lt__、__gt__和其他方法 734
Python 2.6的__cmp__方法(已经从Python 3.0中移除了) 734
布尔测试:__bool__和__len__ 735
Python 2.6中的布尔 736
对象析构函数:__del__ 738
本章小结 739
本章习题 739
习题解答 739
第30章 类的设计 741
Python和OOP 741
通过调用标记进行重载(或不要) 742
OOP和继承:“是一个”关系 743
OOP和组合:“有一个”关系 744
重访流处理器 746
为什么要在意:类和持续性 748
OOP和委托:“包装”对象 749
类的伪私有属性 751
变量名压缩概览 751
为什么使用伪私有属性 752
方法是对象:绑定或无绑定 754
在Python 3.0中,无绑定方法是函数 756
绑定方法和其他可调用对象 757
为什么要在意:绑定方法和回调函数 760
多重继承:“混合”类 760
编写混合显示类 761
类是对象:通用对象的工厂 771
为什么有工厂 772
与设计相关的其他话题 773
本章小结 773
本章习题 774
习题解答 774
第31章 类的高级主题 775
扩展内置类型 775
通过嵌入扩展类型 776
通过子类扩展类型 777
新式类 779
新式类变化 780
类型模式变化 781
钻石继承变动 785
新式类的扩展 789
slots实例 789
类特性 793
__getattribute__和描述符 795
元类 795
静态方法和类方法 796
为什么使用特殊方法 796
Python 2.6和Python 3.0中的静态方法 797
静态方法替代方案 799
使用静态和类方法 800
使用静态方法统计实例 801
用类方法统计实例 802
装饰器和元类:第一部分 805
函数装饰器基础 805
装饰器例子 806
类装饰器和元类 807
更多详细信息 808
类陷阱 809
修改类属性的副作用 809
修改可变的类属性也可能产生副作用 810
多重继承:顺序很重要 811
类、方法以及嵌套作用域 812
Python中基于委托的类:__getattr__和内置函数 814
“过度包装” 814
本章小结 815
本章习题 815
习题解答 815
第六部分练习题 816
为什么要在意:大师眼中的OOP 821
第七部分 异常和工具
第32章 异常基础 825
为什么使用异常 826
异常的角色 826
异常处理:简明扼要 827
默认异常处理器 827
捕获异常 828
引发异常 829
用户定义的异常 830
终止行为 830
为什么要在意:错误检查 832
本章小结 833
本章习题 833
习题解答 834
第33章 异常编码细节 835
try/except/else语句 835
try语句分句 836
try/else分句 839
例子:默认行为 840
例子:捕捉内置异常 841
try/finally语句 841
例子:利用try/finally编写终止行为 842
统一try/except/finally语句 843
统一try语句语法 845
通过嵌套合并finally和except 845
合并try的例子 846
raise语句 847
利用raise传递异常 849
Python 3.0异常链:raise from 849
assert语句 850
例子:收集约束条件(但不是错误) 850
with/as环境管理器 851
基本使用 852
环境管理协议 853
本章小结 855
本章习题 855
习题解答 856
第34章 异常对象 857
异常:回到未来 858
字符串异常很简单 858
基于类的异常 858
类异常例子 859
为什么使用类异常 861
内置Exception类 864
内置异常分类 865
默认打印和状态 866
定制打印显示 867
定制数据和行为 868
提供异常细节 868
提供异常方法 869
本章小结 870
本章习题 870
习题解答 870
第35章 异常的设计 872
嵌套异常处理器 872
例子:控制流程嵌套 873
例子:语法嵌套化 874
异常的习惯用法 876
异常不总是错误 876
函数信号条件和raise 876
关闭文件和服务器连接 877
在try外进行调试 878
运行进程中的测试 879
关于sys.exc_info 879
与异常有关的技巧 880
应该包装什么 881
捕捉太多:避免空except语句 881
捕捉过少:使用基于类的分类 883
核心语言总结 884
Python工具集 884
大型项目的开发工具 885
本章小结 888
第七部分练习题 889
第八部分 高级话题注1
第36章 Unicode和字节字符串 893
Python 3.0中的字符串修改 894
字符串基础知识 895
字符编码方法 895
Python的字符串类型 897
文本和二进制文件 899
Python 3.0中的字符串应用 900
常量和基本属性 900
转换 901
编码Unicode字符串 903
编码ASCII文本 903
编码非ASCII文本 904
编码和解码非ASCII文本 904
其他Unicode编码技术 905
转换编码 907
在Python 2.6中编码Unicode字符串 908
源文件字符集编码声明 910
使用Python 3.0 Bytes对象 911
方法调用 912
序列操作 913
创建bytes对象的其他方式 913
混合字符串类型 914
使用Python 3.0(和Python 2.6)bytearray对象 915
使用文本文件和二进制文件 918
文本文件基础 919
Python 3.0中的文本和二进制模式 919
类型和内容错误匹配 921
使用Unicode文件 922
在Python 3.0中读取和写入Unicode 922
在Python 3.0中处理BOM 924
Python 2.6中的Unicode文件 927
Python 3.0中其他字符串工具的变化 927
re模式匹配模块 927
Struct二进制数据模块 928
pickle对象序列化模块 931
XML解析工具 932
本章小结 935
本章习题 935
习题解答 936
第37章 管理属性 938
为什么管理属性 938
插入在属性访问时运行的代码 939
特性 940
基础知识 940
第一个例子 941
计算的属性 942
使用装饰器编写特性 943
描述符 944
基础知识 945
第一个示例 947
计算的属性 949
在描述符中使用状态信息 950
特性和描述符是如何相关的 952
__getattr__和__getattribute__ 953
基础知识 954
第一个示例 956
计算属性 958
__getattr__和__getattribute__比较 959
管理技术比较 960
拦截内置操作属性 963
重访基于委托的Manager 967
示例:属性验证 970
使用特性来验证 971
使用描述符验证 973
使用__getattr__来验证 974
使用__getattribute__验证 976
本章小结 977
本章习题 977
习题解答 977
第38章 装饰器 979
什么是装饰器 979
管理调用和实例 980
管理函数和类 980
使用和定义装饰器 981
为什么使用装饰器 981
基础知识 982
函数装饰器 982
类装饰器 986
装饰器嵌套 988
装饰器参数 990
装饰器管理函数和类 991
编写函数装饰器 991
跟踪调用 992
状态信息保持选项 993
类错误之一:装饰类方法 997
计时调用 1002
添加装饰器参数 1004
编写类装饰器 1007
单体类 1007
跟踪对象接口 1009
类错误之二:保持多个实例 1012
装饰器与管理器函数的关系 1013
为什么使用装饰器(重访) 1015
直接管理函数和类 1016
示例:“私有”和“公有”属性 1018
实现私有属性 1019
实现细节之一 1021
公有声明的泛化 1022
实现细节之二 1024
开放问题 1025
Python不是关于控制 1029
示例:验证函数参数 1030
目标 1030
针对位置参数的一个基本范围测试装饰器 1031
针对关键字和默认泛化 1033
实现细节 1036
开放问题 1038
装饰器参数 VS 函数注解 1039
其他应用程序:类型测试 1041
本章小结 1042
本章习题 1042
习题解答 1043
第39章 元类 1046
要么是元类,要么不是元类 1046
提高魔力层次 1047
“辅助”函数的缺点 1049
元类与类装饰器的关系:第一回合 1051
元类模型 1053
类是类型的实例 1053
元类是Type的子类 1055
Class语句协议 1056
声明元类 1057
编写元类 1058
基本元类 1058
定制构建和初始化 1059
其他元类编程技巧 1060
实例与继承的关系 1063
示例:向类添加方法 1064
手动扩展 1064
基于元类的扩展 1065
元类与类装饰器的关系:第二回合 1067
示例:对方法应用装饰器 1070
用装饰器手动跟踪 1070
用元类和装饰器跟踪 1071
把任何装饰器应用于方法 1073
元类与类装饰器的关系:第三回合 1074
“可选的”语言功能 1076
本章小结 1078
本章习题 1078
习题解答 1078
第九部分 附录注2
附录A 安装和配置 1083
附录B 各部分练习题的解答 1093
Python是一种简单的、解释型的、交互式的、可移植的、面向对象的超高级语言。Python作为一种功能强大且通用的编程语言而广受好评,它具有非常清晰的语法特点,适用于多种操作系统,目前在国际上非常流行,正在得到越来越多的应用。
  Python有一个交互式的开发环境,因为Python是解释运行,这大大节省了每次编译的时间。Python语法简单,且内置了多种高级数据结构,如字典、列表等,所以使用起来特别简单,程序员很快就可学会并掌握它。Python具有大部分面向对象语言的特征,可完全进行面向对象编程。Python具有简单易用、可移植性强等特点,得到了众多程序员的青睐。它可以在MS-DOS、Windows、Windows NT、Linux等多种操作系统上运行。在最新的TIOBE开发语言排行中,Python名列第七。
  本书是学习Python编程语言的入门书籍,目标是让读者快速掌握核心Python语言基础。本书设计成一本教程,主要关注核心Python语言本身,而不是其特定的应用程序。本书基于一个带有测试和练习的3天的Python培训课程,所以可以充当该语言的一个自学教程。本书至今已更新至第4版,每一版都得到广大读者的喜爱。本书内容详尽,从Python语言最基础和最核心的功能开始介绍,每章、每部分都配有丰富的习题,帮助读者巩固所学的知识。
  本书篇幅很大,作者的介绍力求详尽而细致,有些地方难免显得冗长。加上新版的翻译工作量非常巨大,译者团队为此付出了艰辛的工作和努力,牺牲了很多的时间。但由于内容的广度和深度,难免有未尽之处,还请读者多多批评指正。参加本书翻译工作的有李军、刘金华、刘伟超、罗庚臣、刘二然、郑芳菲、庄逸川、王世高、郭莹、陈垚、邓勇、何进伟、贾晓斌、汪蔚、齐国涛、刘红伟、景龙、景文正、孙海军、李振胜、李秋强、楚亚军、景文生、王志刚、安宁宁、党耀云等。读者在阅读和学习过程中,如有问题可通过lijun961@sina.com与译者联系。
计算机\程序设计
相关视频
读者书评
发表评论



高级搜索
运维前线:一线运维专家的运维方法、技巧与实践
UX权威指南:确保良好用户体验的流程和最佳实践
Arduino计算机视觉编程


版权所有© 2017  北京华章图文信息有限公司 京ICP备08102525号 京公网安备110102004606号
通信地址:北京市百万庄南街1号 邮编:100037
电话:(010)68318309, 88378998 传真:(010)68311602, 68995260
高校教师服务
华章教育微信
诚聘英才
诚聘英才