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

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

7.4411 评价豆瓣读书
春暖花开季 恰是读书时满500减300、满200减120、满100减60活动详情

作品简介

在通往“Python技术殿堂”的路上,本书将为你编写健壮、优雅、高质量的Python代码提供切实帮助!内容全部由Python编码的最佳实践组成,从基本原则、惯用法、语法、库、设计模式、内部机制、开发工具和性能优化8个方面深入探讨了编写高质量Python代码的技巧与禁忌,一共总结出91条宝贵的建议。每条建议对应Python程序员可能会遇到的一个问题。本书不仅以建议的方式从正反两方面给出了被实践证明为十分优秀的解决方案或非常糟糕的解决方案,而且分析了问题产生的根源,会使人有一种醍醐灌顶的感觉,豁然开朗。

《编写高质量代码:改善Python程序的91个建议》针对每个问题所选择的应用场景都非常典型,给出的建议也都与实践紧密结合。书中的每一条建议都可能在你的下一行代码、下一个应用或下一个项目中显露锋芒。建议你将本书搁置在手边,随时查阅,相信这么做一定能使你的学习和开发工作事半功倍。

张颖,资深软件开发工程师,精通Java、Python、Perl等技术,以及多种脚本语言,有多年开发经验。曾就职于阿尔卡特朗讯上海公司的LTE无线事业部,现就职于IBM CSTL,工作期间获得过多种奖励,并于2012年获得一项云计算相关的专利。

赖勇浩,资深软件开发工程师,自2006年起以编写Python代码为生,现已创业。在Python领域有深厚的积累,CSDN博客专家,博客浏览量超过200万。也是珠三角技术沙龙创始人之一,从2009年起担任沙龙组委,长年活跃在社区第一线,在国内Python圈子里有较高的知名度和影响力。有超过7年的游戏开发经验,擅长Python、C++等网游相关的技术,曾就职于网易等网游研发厂商;现专注于中国彩票事业,开发互联网、电话和自助终端彩票销售平台,以促进行业信息化为己任。

作品目录

  1. 前 言
  2. 第1章 引 论
  3. 建议1:理解Pythonic概念
  4. 建议2:编写Pythonic代码
  5. 建议3:理解Python与C语言的不同之处
  6. 建议4:在代码中适当添加注释
  7. 建议5:通过适当添加空行使代码布局更为优雅、合理
  8. 建议6:编写函数的4个原则
  9. 建议7:将常量集中到一个文件
  10. 第2章 编程惯用法
  11. 建议8:利用assert语句来发现问题
  12. 建议9:数据交换值的时候不推荐使用中间变量
  13. 建议10:充分利用Lazy evaluation的特性
  14. 建议11:理解枚举替代实现的缺陷
  15. 建议12:不推荐使用type来进行类型检查
  16. 建议13:尽量转换为浮点类型后再做除法
  17. 建议14:警惕eval()的安全漏洞
  18. 建议15:使用enumerate()获取序列迭代的索引和值
  19. 建议16:分清==与is的适用场景
  20. 建议17:考虑兼容性,尽可能使用Unicode
  21. 建议18:构建合理的包层次来管理module
  22. 第3章 基 础 语 法
  23. 建议19:有节制地使用from...import语句
  24. 建议20:优先使用absolute import来导入模块
  25. 建议21:i+=1不等于++i
  26. 建议22:使用with自动关闭资源
  27. 建议23:使用else子句简化循环(异常处理)
  28. 建议24:遵循异常处理的几点基本原则
  29. 建议25:避免finally中可能发生的陷阱
  30. 建议26:深入理解None,正确判断对象是否为空
  31. 建议27:连接字符串应优先使用join而不是+
  32. 建议28:格式化字符串时尽量使用.format方式而不是%
  33. 建议29:区别对待可变对象和不可变对象
  34. 建议30:[]、()和{}:一致的容器初始化形式
  35. 建议31:记住函数传参既不是传值也不是传引用
  36. 建议32:警惕默认参数潜在的问题
  37. 建议33:慎用变长参数
  38. 建议34:深入理解str()和repr()的区别
  39. 建议35:分清staticmethod和classmethod的适用场景
  40. 第4章 库
  41. 建议36:掌握字符串的基本用法
  42. 建议37:按需选择sort()或者sorted()
  43. 建议38:使用copy模块深拷贝对象
  44. 建议39:使用Counter进行计数统计
  45. 建议40:深入掌握ConfigParser
  46. 建议41:使用argparse处理命令行参数
  47. 建议42:使用pandas处理大型CSV文件
  48. 建议43:一般情况使用ElementTree解析XML
  49. 建议44:理解模块pickle优劣
  50. 建议45:序列化的另一个不错的选择——JSON
  51. 建议46:使用traceback获取栈信息
  52. 建议47:使用logging记录日志信息
  53. 建议48:使用threading模块编写多线程程序
  54. 建议49:使用Queue使多线程编程更安全
  55. 第5章 设 计 模 式
  56. 建议50:利用模块实现单例模式
  57. 建议51:用mixin模式让程序更加灵活
  58. 建议52:用发布订阅模式实现松耦合
  59. 建议53:用状态模式美化代码
  60. 第6章 内 部 机 制
  61. 建议54:理解built-in objects
  62. 建议55:__init__()不是构造方法
  63. 建议56:理解名字查找机制
  64. 建议57:为什么需要self参数
  65. 建议58:理解MRO与多继承
  66. 建议59:理解描述符机制
  67. 建议60:区别__getattr__()和__getattribute__()方法
  68. 建议61:使用更为安全的property
  69. 建议62:掌握metaclass
  70. 建议63:熟悉Python对象协议
  71. 建议64:利用操作符重载实现中缀语法
  72. 建议65:熟悉 Python 的迭代器协议
  73. 建议66:熟悉 Python 的生成器
  74. 建议67:基于生成器的协程及greenlet
  75. 建议68:理解GIL的局限性
  76. 建议69:对象的管理与垃圾回收
  77. 第7章 使用工具辅助项目开发
  78. 建议70:从PyPI安装包
  79. 建议71:使用pip和yolk安装、管理包
  80. 建议72:做paster创建包
  81. 建议73:理解单元测试概念
  82. 建议74:为包编写单元测试
  83. 建议75:利用测试驱动开发提高代码的可测性
  84. 建议76:使用Pylint检查代码风格
  85. 建议77:进行高效的代码审查
  86. 建议78:将包发布到PyPI
  87. 第8章 性能剖析与优化
  88. 建议79:了解代码优化的基本原则
  89. 建议80:借助性能优化工具
  90. 建议81:利用cProfile定位性能瓶颈
  91. 建议82:使用memory_profiler 和 objgraph 剖析内存使用
  92. 建议83:努力降低算法复杂度
  93. 建议84:掌握循环优化的基本技巧
  94. 建议85:使用生成器提高效率
  95. 建议86:使用不同的数据结构优化性能
  96. 建议87:充分利用set的优势
  97. 建议88:使用multiprocessing克服GIL的缺陷
  98. 建议89:使用线程池提高效率
  99. 建议90:使用C/C++模块扩展提高性能
  100. 建议91:使用 Cython 编写扩展模块
载入中

热门划线

  1. 作为用来初始化的__init__()方法在多继承的情况下,子类的__init__()方法如果不显式调用父类的__init__()方法,则父类的__init__()方法不会被调用。10 人
  2. 当条件是业务逻辑继续下去的先决条件时可以使用断言。8 人
  3. 断言实际是被设计用来捕获用户所定义的约束的,而不是用来捕获程序本身错误的7 人
  4. 要获取迭代过程中字典的key和value,应该使用如下iteritems()方法:7 人
  5. 前 言6 人
  6. 如果使用对象不是信任源,应该尽量避免使用eval,在需要使用eval的地方可用安全性更好的ast.literal_eval替代6 人
  7. 当try块中发生异常的时候,如果在except语句中找不到对应的异常处理,异常将会被临时保存起来,当finally执行完毕的时候,临时保存的异常将会再次被抛出,但如果finally语句中产生了新的异常或者执行了return或者break语句,那么临时保存的异常将会被丢失,从而导致异常屏蔽。6 人
  8. sorted()作用于任意可迭代的对象,而sort()一般作用于列表。6 人
  9. 最好调用者在上,被调用者在下5 人
  10. 如果Python本身的异常能够处理就不要再使用断言。5 人
  11. 如果对于or条件表达式应该将值为真可能性较高的变量写在or的前面,而and则应该推后。5 人
  12. ython中最典型的使用延迟计算的例子就是生成器表达式了,它仅在每次需要计算的时候才通过yield产生所需要的元素。斐5 人
  13. is的作用是用来检查对象的标示符是否一致的,也就是比较两个对象在内存中是否拥有同一块内存空间,它并不适合用来判断两个字符串是否相等。5 人
  14. 有节制地使用from a import B形式,可以直接访问B。5 人
  15. 当循环“自然”终结(循环条件为假)时else从句会被执行一次5 人
  16. try块没有抛出任何异常时,执行else块5 人
  17. 在解释器中直接输入a时默认调用repr()函数,而print a则调用str()函数。5 人
  18. self表示的就是实例对象本身,即SelfTest类的对象在内存中的地址。5 人

大家都喜欢