编写高质量代码:改善Python程序的91个建议

所需积分/C币:50 2017-11-21 11:02:28 20.94MB PDF
收藏 收藏
举报

在通往“Python技术殿堂”的路上,本书将为你编写健壮、优雅、高质量的Python代码提供切实帮助!内容全部由Python编码的最佳实践组成,从基本原则、惯用法、语法、库、设计模式、内部机制、开发工具和性能优化8个方面深入探讨了编写高质量Python代码的技巧与禁忌,一共总结出91条宝贵的建议。每条建议对应Python程序员可能会遇到的一个问题。本书不仅以建议的方式从正反两方面给出了被实践证明为十分优秀的解决方案或非常糟糕的解决方案,而且分析了问题产生的根源,会使人有一种醍醐灌顶的感觉,豁然开朗。, 《编写高质量代码:改善Python程序的91个建议》针对每个问题所选择的应用场景都非常典型,
%前言 为什么要写这本书 当这本书的写作接近尾声的时候,回过头来看看这一年多的写作历程,不由得心生感 叹,这是一个痛并快乐着的过程。不必说牺性了多少个周末,也不必计算多少个夜晚伏案写 作,单是克服写作过程中因疲劳而迸发出来的彷徨、犹豫和动摇等情绪都觉得是件不容易的 事情。但不管怎么说,这最终是个沉淀和收获的过程,写作的同时我也和读者们一样在进 步。为什么要写这本书?可以说是机缘巧合。机械工业出版社的杨福川老师联系到我,说他 们打算策划一本关于高质量 Python编程方面的书籍,问我有没有兴趣加入。实话实说,最开 始我是持否定态度的,一则因为业余时间实在有限,无法保证我“工作和生活要平衡”的理 念;二则觉得自己水平有限,在学习 Python的道路上我和千千万万读者一样,只是一个普 通的“朝圣者”,我也有迷惑不解的时候,在没有修炼到大彻大悟之前拿什么来给人传道授 业?是赖勇浩老师的加入给我注入了一针强心剂,他丰富的 Python项目经验以及长期活跃于 Python社区所积累下来的名望无形中给了我一份信心。杨老师的鼓励和支持也更加坚定了我 的态度,经过反复考虑和调整自己的心态,最终我决定和赖老师一起完成这本书。因为我也 经历过从零开始的 Python学习过程,我也遇到过各种困惑,经历过不同的曲折,这些可能也 正是每一个学习 Python的人从最初到进阶这一过程中都会遇到的问题。抱着分享自己在学习 和工作中所积累的一点微薄经验的心态,我开始了本书的写作之旅。这个过程也被我当作是 对自己学过的知识的一种梳理。如果与此同时,还能够给读者带来一些启示和思索,那将是 这本书所能带给我的最大收获了。 读者对象 口有一定的 Python基础,希望通过项目最佳实践来提升自己的相关 Python人员。 口希望进一步掌握 Python相关内部机制的技术人员。 口希望写出更高质量、更 Pythonic代码的编程人员。 口开设相关课程的大专院校师生。 如何阅读本书 首先需要注意的是,本书并不是人门级的语法介绍类的书籍,因此在阅读本书之前假定 你已经掌握了最基础的 Python语法。如果没有,也没有关系,你可以先找一本最简单的介绍 Python语法的书籍看看,尝试写几个 Python小程序之后再来阅读本书。 本书分为8章,主要从编程惯用法、基础语法、库、设计模式、内部机制、开发工具、 性能剖析与优化等方面解读如何编写高质量的 Python程序。每个章节的内容都以建议的形式 呈现,这些建议或源于实际项目应用经验,或源于对 Python本质的理解和探讨,或源于社区 推荐的做法。它们能够帮助读者快速完成从人门到进阶的这个过程。 由于各个章节相对独立,因此无须花费整段的时间从头开始阅读。你可以在空闲的时候 选取任意感兴趣的小节阅读。为了减轻读者负担,本书代码尽量保持完整,阅读过程中无须 额外下载其他相关代码。 勘误和支持 由于作者的水平有限,加之编写时间仓促,书中难免会出现一些错误或者不准确的地 方,恳请读者批评指正。如果你在阅读过程中遇到任何问题或者发现任何错误,欢迎发送邮 件至邮箱 highqualitypython@l63com,我们会尽量一一解答直到你满意。期待能够得到你的 真挚反馈。 致谢 首先要感谢机械工业出版社华章公司的杨福川老师,因为有了你的鼓励才使我有勇气 开始这本书。还要感谢机械工业出版社的孙海亮编辑,在这一年多的时间中始终支持我的写 作,是你的鼓励和帮助引导我顺利完成全部书稿。当然也要感谢我的搭档赖老师,和你合作 是一件非常愉快的事情,也让我收获颇多。 其次要感谢我的家人,是你们的宽容、支持和理解给了我完成本书的动力,也是你们无 微不至的照顾让我不必为生活中的琐事烦心,从而能全身心地投入到写作中去。 最后,我想提前感谢一下本书的读者,谢谢你们能够选择阅读这本书,这将是作为作者 的我们最大的荣幸。 谨以此书献给所有热爱 Python的朋友们! 张颖 前言 第1章引论 建议1:理解 Pythonic概念… 建议2:编写 Pythonic代码 建议3:理解 Python与C语言的不同之处 .t●....··..普.·。。·。.··。··.普,·。··.············· 8 建议4:在代码中适当添加注释 ·10 建议5:通过适当添加空行使代码布局更为优雅、合理… 12 建议6:编写函数的4个原则 。·非非非。音非·非·音着.带 15 建议7:将常量集中到一个文件 18 第2章编程惯用法 0 建议8:利用 assert语句来发现问题…… ……20 建议9:数据交换值的时候不推荐使用中间变量 ··············.······················· 22 建议10:充分利用 Lazy evaluation的特性………………………24 建议11:理解枚举替代实现的缺陷 鲁。非非 ……25 建议12:不推荐使用type来进行类型检查 …………27 建议13:尽量转换为浮点类型后再做除法 ……29 建议14:警惕evlO的安全漏洞 31 建议15:使用 enumerate获取序列迭代的索引和值… 33 建议16:分清=与is的适用场景… 35 建议17:考虑兼容性,尽可能使用 Unicode ……37 VI 建议18:构建合理的包层次来管理 module…… 鲁自 42 第3章基础语法 着自。音。·。。。。。·垂··垂 45 建议19:有节制地使用 from. import语句… b·。音垂 …45 建议20:优先使用 absolute import来导人模块 …48 建议21:i=1不等于++i ……50 建议22:使用ⅵit自动关闭资源…50 建议23:使用else子句简化循环(异常处理)… 春·非鲁自非·着·。非·非···。 ……………53 建议24:遵循异常处理的几点基本原则 55 建议25:避免 finally中可能发生的陷阱 ………59 建议26:深入理解None,正确判断对象是否为空 建议27:连接字符串应优先使用jin而不是+…… 62 建议28:格式化字符丰时尽量使用 format方式而不是% 建议29:区别对待可变对象和不可变对象… 建议30:口、0和{}:一致的容器初始化形式 建议31:记住函数传参既不是传值也不是传引用 章垂。非 …73 建议32:警惕默认参数潜在的问题… 建议33:慎用变长参数… …78 建议34:深人理解stO和repr0的区别 ·垂·垂 建议35:分清 staticmethod和 classmethod的适用场景…… 第4章库 86 建议36:掌握字符串的基本用法 ……………86 建议37:按需选择sort0或者 sorted…… 89 建议38:使用copy模块深拷贝对象… ……92 建议39:使用 Counter进行计数统计… ……………………95 建议40:深人掌握 ConfigParser… ……97 建议41:使用 argparse处理命令行参数 建议42:使用 pandas处理大型CsV文件 建议43:一般情况使用 ElementTree解析XM 107 建议44:理解模块 pickle优劣 建议45:序列化的另一个不错的选择—JSON… 113 建议46:使用 traceback获取栈信息…… ………116 建议47:使用 logging记录日志信息 …119 建议48:使用 threading模块编写多线程程序…… 122 建议49:使用 Queue使多线程编程更安全… 125 第5章设计模式 自。非 …129 建议50:利用模块实现单例模式 …129 建议51:用 mixin模式让程序更加灵活 ………132 建议52:用发布订阅模式实现松耦合 …134 建议53:用状态模式美化代码 …137 第6章内部机制 ……141 建议54:理解 built-in objects 建议55:init0不是构造方法 ………143 建议56:理解名字查找机制… …147 建议57:为什么需要self参数 ……151 建议58:理解MRO与多继承… ●·····非音非非 ……154 建议59:理解描述符机制 。。·D·垂 ………157 建议60:区别geat0和_ getattribute0方法 ………160 建议61:使用更为安全的 property… 164 建议62:掌握 metaclass ………169 建议63:熟悉 Python对象协议 …176 建议64:利用操作符重载实现中级语法 179 建议65:熟悉 Python的迭代器协议 ………181 建议66:熟悉 Python的生成器 ………185 建议67:基于生成器的协程及 greenlet …188 建议68:理解G的局限性 192 建议69:对象的管理与垃圾回收 ……194 第7章使用工具辅助项目开发 197 建议70:从PyP安装包 …197 建议71:使用pp和yok安装、管理包 199 建议72:做 paster创建包… ……202 建议73:理解单元测试概念 …209 建议74:为包编写单元测试 212 建议75:利用测试驱动开发提高代码的可测性… 216 建议76:使用 Pylint检查代码风格 218 建议77:进行高效的代码审查 …221 建议78:将包发布到PyPI… …224 第8章性能剖析与优化 ……227 建议79:了解代码优化的基本原则 ……227 建议80:借助性能优化工具… …228 建议81:利用 pRofile定位性能瓶颈 …229 建议82:使用 memory_ profiler和 bigraph剖析内存使用 b。。e·垂· 235 建议83:努力降低算法复杂度 …………237 建议84:掌握循环优化的基本技巧……38 建议85:使用生成器提高效率 240 建议86:使用不同的数据结构优化性能 ………243 建议87:充分利用set的优势… 245 建议88:使用 multiprocessing克服GL的缺陷 ……248 建议89:使用线程池提高效率… …………254 建议90:使用CC++模块扩展提高性能 257 建议91:使用 Cython编写扩展模块…… …………259 郾蜜酈慾瞼 愍镪鹚 限馨區 第1章氵 Cntc 引论 罗马不是一天建成的”,编写代码水平的提升也不可能一蹴而就,通过一点一滴的积累, 才能达成从量变到质变的飞跃。这种积累可以从很多方面取得,如一些语言层面的使用技 巧、常见的注意事项、编程风格等。本章主要探讨 Python中常见的编程准则,从而帮助读者 进一步理解 Python的本质。本章内容包括如何编写 Pythonic代码、在实际应用中需要注意 的一些事项和值得提倡的一些做法。希望读者通过对本章的学习,可以在实际应用 Pythonic 的过程中得到启发和帮助。 建议1:理解 Pythonic概念 什么是 Pythonic?这是很难定义的,这就是为什么大家无法通过搜索引擎找到准确答 案的原因。但很难定义的概念绝非意味着其定义没有价值,尤其不能否定它对编写优美的 Python代码的指导作用。 对于 Pythonic的概念,众人各有自己的看法,但大家心目之中都认同一个更具体的指 南,那就是 Tim Peters的《 The Zen of Python》( Python之禅)。在这一充满着禅意的诗篇中, 有几点非常深入人心 口美胜丑,显胜隐,简胜杂,杂胜乱,平胜陡,疏胜密。 口找到简单问题的一个方法,最好是唯一的方法(正确的解决之道)。 口难以解释的实现,源自不好的主意;如有非常棒的主意,它的实现肯定易于解释。 不仅这几点,其实《 Python之禅》中的每一句都可作为编程的信条。是的,不仅是作为 编写 Python代码的信条,以它为信条编写出的其他语言的代码也会非常漂亮。 (1) Pythonic的定义 遵循 Pythonic的代码,看起来就像是伪代码。其实,所有的伪代码都可以轻易地转换为 可执行的 Python代码。比如在 Wikipedia的快速排序条目中有如下伪代码: function quicksort('array) if1 ength(" array')≤1 return 'array /an array of zero or one elements is already sorted select and remove a pivot element pivot i from array Isee ' Choice of pivot below create empty lists 'less and 'greater for each x in array if 'x's'pivot then append 'x'to 'less' else append 'xto ' greate eturn concatenate(quicksort('less), list('pivot'),quicksort('greater')) ∥ two recursive ca11s 实际上,它可以转化为以下同等行数的可以执行的 Python代码 def quicksort(array) less =[]i greater =[ if len(array)<=1: return array pivot array pop( for x in array: if x < pivot: less append (x) else: greater append(x) return quicksort(less)+[pivot]+quicksort(greater) 看,行数一样的 Python代码甚至可读性比伪代码还要好吧?但它真的可以运行,结果如下 >>> quicksort([9,8,4,5,32,64,2,1,0,10;19;27]) [0,1,2,4,58,9,10,19,27,32,64 所以,综合这个例子来说, Pythonic也许可以定义为:充分体现 Python自身特色的代码 风格。接下来就看看这样的代码风格在实际中是如何体现的。 (2)代码风格 对于风格,光说是没有用的,最好是通过例子来看看,因为例子看得见,会显得更真 实。下面以语法、库和应用程序为例给大家介绍。 在语法上,代码风格要充分表现 Python自身特色。举个最常见的例子,在其他的语言 (如C语言)中,两个变量交换需要如下的代码: int a =l, b=2; int tmp =ai a = b b = tmpi 利用 Python的 packaging/ unpackaging机制, Pythonic的代码只需要以下一行: ehttp://en.wikipediaorg/wiki/quicksort

...展开详情
试读 127P 编写高质量代码:改善Python程序的91个建议
立即下载 低至0.43元/次 身份认证VIP会员低至7折
抢沙发
一个资源只可评论一次,评论内容不能少于5个字
关注 私信 TA的资源
上传资源赚积分,得勋章
最新推荐
编写高质量代码:改善Python程序的91个建议 50积分/C币 立即下载
1/127
编写高质量代码:改善Python程序的91个建议第1页
编写高质量代码:改善Python程序的91个建议第2页
编写高质量代码:改善Python程序的91个建议第3页
编写高质量代码:改善Python程序的91个建议第4页
编写高质量代码:改善Python程序的91个建议第5页
编写高质量代码:改善Python程序的91个建议第6页
编写高质量代码:改善Python程序的91个建议第7页
编写高质量代码:改善Python程序的91个建议第8页
编写高质量代码:改善Python程序的91个建议第9页
编写高质量代码:改善Python程序的91个建议第10页
编写高质量代码:改善Python程序的91个建议第11页
编写高质量代码:改善Python程序的91个建议第12页
编写高质量代码:改善Python程序的91个建议第13页
编写高质量代码:改善Python程序的91个建议第14页
编写高质量代码:改善Python程序的91个建议第15页
编写高质量代码:改善Python程序的91个建议第16页
编写高质量代码:改善Python程序的91个建议第17页
编写高质量代码:改善Python程序的91个建议第18页
编写高质量代码:改善Python程序的91个建议第19页
编写高质量代码:改善Python程序的91个建议第20页

试读结束, 可继续阅读

50积分/C币 立即下载 >