描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111523550丛书名: Effective系列丛书
【本书根据Python3.8新特性更新至第2版,新增31条高效方法,建议购买新版】
本书作者BrettSlatkin以使用场景为主导的精练教学方式,汇聚了59条优秀的实践原则、开发技巧和便捷方案,并以实用的代码范例来解释它们。作者根据自己在Google公司多年开发Python基础架构所积累的经验,揭示了Python语言中一些鲜为人知的微妙特性,并给出了能够改善代码功能及运行效率的习惯用法。通过本书,你能够了解到解决关键编程任务所用的**方式,并学会编写易于理解、便于维护且利于改进的代码。
目 录?Contents
本书赞誉
译??者??序
前 言
致 谢
第1章 用Pythonic方式来思考 1
第1条:确认自己所用的Python版本 1
第2条:遵循PEP 8风格指南 3
第3条:了解bytes、str与unicode的区别 5
第4条:用辅助函数来取代复杂的表达式 8
第5条:了解切割序列的办法 10
第6条:在单次切片操作内,不要同时指定start、end和stride 13
第7条:用列表推导来取代map和f?ilter 15
第8条:不要使用含有两个以上表达式的列表推导 16
第9条:用生成器表达式来改写数据量较大的列表推导 18
第10条:尽量用enumerate取代range 20
第11条:用zip函数同时遍历两个迭代器 21
第12条:不要在for和while循环后面写else块 23
第13条:合理利用try/except/else/f?inally结构中的每个代码块 25
第2章 函数 28
第14条:尽量用异常来表示特殊情况,而不要返回None 28
第15条:了解如何在闭包里使用外围作用域中的变量 30
第16条:考虑用生成器来改写直接返回列表的函数 35
第17条:在参数上面迭代时,要多加小心 37
第18条:用数量可变的位置参数减少视觉杂讯 41
第19条:用关键字参数来表达可选的行为 43
第20条:用None和文档字符串来描述具有动态默认值的参数 46
第21条:用只能以关键字形式指定的参数来确保代码明晰 49
第3章 类与继承 53
第22条:尽量用辅助类来维护程序的状态,而不要用字典和元组 53
第23条:简单的接口应该接受函数,而不是类的实例 58
第24条:以@classmethod形式的多态去通用地构建对象 62
第25条:用super初始化父类 67
第26条:只在使用Mix-in组件制作工具类时进行多重继承 71
第27条:多用public属性,少用private属性 75
第28条:继承collections.abc以实现自定义的容器类型 79
第4章 元类及属性 84
第29条:用纯属性取代get和set方法 84
第30条:考虑用@property来代替属性重构 88
第31条:用描述符来改写需要复用的@property方法 92
第32条:用__getattr__、__getattribute__和__setattr__实现按需生成的属性 97
第33条:用元类来验证子类 102
第34条:用元类来注册子类 104
第35条:用元类来注解类的属性 108
第5章 并发及并行 112
第36条:用subprocess模块来管理子进程 113
第37条:可以用线程来执行阻塞式I/O,但不要用它做平行计算 117
第38条:在线程中使用Lock来防止数据竞争 121
第39条:用Queue来协调各线程之间的工作 124
第40条:考虑用协程来并发地运行多个函数 131
第41条:考虑用concurrent.futures来实现真正的平行计算 141
第6章 内置模块 145
第42条:用functools.wraps定义函数修饰器 145
第43条:考虑以contextlib和with语句来改写可复用的try/f?inally代码 148
第44条:用copyreg实现可靠的pickle操作 151
第45条:应该用datetime模块来处理本地时间,而不是用time模块 157
第46条:使用内置算法与数据结构 161
第47条:在重视精确度的场合,应该使用decimal 166
第48条:学会安装由Python开发者社区所构建的模块 168
第7章 协作开发 170
第49条:为每个函数、类和模块编写文档字符串 170
第50条:用包来安排模块,并提供稳固的API 174
第51条:为自编的模块定义根异常,以便将调用者与API相隔离 179
第52条:用适当的方式打破循环依赖关系 182
第53条:用虚拟环境隔离项目,并重建其依赖关系 187
第8章 部署 193
第54条:考虑用模块级别的代码来配置不同的部署环境 193
第55条:通过repr字符串来输出调试信息 195
第56条:用unittest来测试全部代码 198
第57条:考虑用pdb实现交互调试 201
第58条:先分析性能,然后再优化 203
第59条:用tracemalloc来掌握内存的使用及泄漏情况 208
前 言
Python编程语言很强大、很有魅力,但同时也很独特,所以掌握起来比较困难。许多程序员从他们所熟悉的语言转入Python之后,没能把思路打开,以致写出的代码无法完全发挥出Python的特性,而另外一些程序员则相反,他们滥用Python的特性,导致程序可能在将来出现严重问题。
本书会深入讲解如何以符合Python风格的(Pythonic)方式来编写程序,这种方式就是运用Python语言的**方式。笔者假定你对这门语言已经有了初步了解。编程新手可以通过本书学到各种Python功能的**用法,而编程老手则能够学会如何自信地运用一种功能强大的新工具。
笔者的目标是令大家学会用Python来开发优秀的软件。
本书涵盖的内容本书每一章都包含许多互相关联的条目,大家可以按照自己的需要,随意阅读这些条目。每个条目都包含简明而具体的教程,告诉你应该如何更高效地编写Python程序。笔者在每个条目里面都给出了建议,告诉大家应该怎样做、应该避免哪些用法,以及如何在各种做法之间求得平衡,并解释了笔者所选的做法好在哪里。
本书中的各项条目,适用于Python 3和Python 2(请参阅本书第1条)。对于Jython、IronPython或PyPy等其他运行时环境,大部分条目应该同样适用。
第1章:用Pythonic方式来思考Python开发者用Pythonic这个形容词来描述具有特定风格的代码。这种风格是大家在使用Python语言进行编程并相互协作的过程中逐渐形成的习惯。本章讲解如何以该风格来完成常见的Python编程工作。
第2章:函数Python中的函数具备多种特性,这可以简化编程工作。Python函数的某些性质与其他编程语言中的函数相似,但也有些性质是Python独有的。本章介绍如何用函数来表达意图、提升可复用程度,并减少bug。
第3章:类与继承Python是面向对象的语言。用Python编程时,通常需要编写新类,并定义这些类应该如何通过其接口及继承体系与外界相交互。本章讲解如何使用类和继承来表达对象所应具备的行为。
第4章:元类及属性元类(metaclass)及动态属性(dynamic attribute)都是很强大的Python特性,然而它们也可能导致极其古怪、极其突然的行为。本章讲解这些机制的常见用法,以确保读者写出来的代码符合*小惊讶原则(rule of least surprise)。
第5章:并发及并行用Python很容易就能写出并发程序,这种程序可以在同一时间做许多件不同的事情。我们也可以通过系统调用、子进程(subprocess)及C语言扩展来实现并行处理。本章讲解如何在不同情况下充分利用这些Python特性。
第6章:内置模块Python预装了许多写程序时会用到的重要模块。这些标准软件包与通常意义上的Python语言联系得非常紧密,我们可以将其当成语言规范的一部分。本章将会讲解基本的内置模块。
第7章:协作开发如果许多人要开发同一个Python程序,那就得仔细商量代码的写法了。即便你是一个人开发,也需要理解其他人所写的模块。本章讲解多人协作开发Python程序时所用的标准工具及**做法。
第8章:部署Python提供了一些工具,使我们可以把软件部署到不同的环境中。它也提供了一些模块,令开发者可以把程序编写得更加健壮。本章讲解如何使用Python调试、优化并测试程序,以提升其质量与性能。
本书使用的约定本书在Python代码风格指南(Python style guide)的基础上做了一些修改,使范例代码便于印刷,也便于凸显其中的重要内容。一行代码比较长时,会以?字符来表示折行。代码中的某些部分,与当前要讲的问题联系不大,笔者会将这部分代码略去,并在注释中以省略号来表示(# …)。为了缩减范例代码的篇幅,笔者也把内嵌的文档删去了。读者在开发自己的项目时不应该这么做,而是应该遵循Python风格指南(参见本书第2条),并为源代码撰写开发文档(参见本书第49条)。
书中大部分代码,运行之后都会产生输出(output)。笔者所谓的输出,意思是说:在互动式解释器(interactive interpreter)中运行这些Python程序时,控制台或终端机里面会打印出一些信息。这些打印出来的信息,以等宽字体印刷,它们上方的那一行会标有>>>符号(这个>>>符号是Python解释器的提示符)。笔者使用这个符号是想告诉大家:把>>>上方的那些范例代码输入Python shell之后,会产生与>>>下方文字相符的输出信息。
除此之外,还有一些上方虽无>>>符号,但却以等宽字体印刷的代码段。这些内容用来表示产生于Python解释器之外的输出信息。它们的上方通常都会有$字符,这表示笔者是在Bash之类的命令行shell里面先运行了程序,然后才产生这些输出的。
获取源代码及勘误表大家可以抛开本书的讲解部分,把某些范例作为完整的程序运行一遍,这样是很有好处的。你可以用这些代码做实验,以了解整个程序的运行原理。全部源码都可以从本书网站(http://www.effectivepython.com/)下载。书中的错误也会张贴到该网站。
致 谢?Acknowledgements在生活中,有很多人给了我指导、支持及鼓励,没有他们,本书就不会面世。
感谢《Effective Software Development》系列的顾问Scott Meyers。笔者15岁那年初次阅读了Scott所写的《Effective C 》,当时我就迷上了这门语言。我后来的教育经历,以及在Google的**份工作,无疑都得益于Scott的那本书。这次有机会写作本书,本人深感荣幸。
感谢核心技术评审者Brett Cannon、Tavis Rudd和Mike Taylor,他们为本书提供了深刻而透彻的反馈意见。感谢Leah Culver和Adrian Holovaty,他们两位认为写作这样一本书很有意义。感谢友人Michael Levine、Marzia Niccolai、Ade Oshineye和Katrina Sostek,他们耐心阅读了本书的初稿。也感谢Google诸位同事审读本书。若没有以上诸君的帮助,本书读起来可能就会比较费解。
感谢制作本书的每一位工作人员。感谢编辑Trina MacDonald启动本书制作流程,并提供大力支持。感谢诸位团队成员帮助制作本书,他们是:策划编辑Tom Cirtin和Chris Zahn、助理编辑Olivia Basegio、营销经理Stephane Nakib、文字编辑Stephanie Geels,以及生产编辑Julie Nahil。
感谢与我共事的诸位优秀Python程序员:Anthony Baxter、Brett Cannon、Wesley Chun、Jeremy Hylton、Alex Martelli、Neal Norwitz、Guido van Rossum、Andy Smith、Greg Stein和Ka-Ping Yee。很高兴你们能督促并指引我学习Python。Python开发社团构建得非常优秀,成为一名Python开发者,令我感到特别荣幸。
感谢诸位同事这些年来对我的关照。感谢Kevin Gibbs帮助我应对风险。感谢Ken Ashcraft、Ryan Barrett和Jon McAlister教会我如何工作。感谢Brad Fitzpatrick帮助我提升工作能力。感谢Paul McDonald陪我一起创建我们的搞怪项目。感谢Jeremy Ginsberg和Jack Hebert令其成为现实。
感谢激发我编程兴趣的诸位老师:Ben Chelf、Vince Hugo、Russ Lewin、Jon Stemmle、Derek Thomson和Daniel Wang。正因为有了你们的指引,我才会努力磨练编程技术,进而使自己有能力去教导他人。
感谢母亲使我找到了人生的目标并鼓励我做程序员。感谢兄弟、祖父母、众亲戚以及儿时的玩伴,从小你们就是我的榜样,也使我找到了成长的快乐。
*后要感谢我的妻子Colleen,感谢她的关爱和支持,感谢她带来的欢笑。
评论
还没有评论。