内容推荐 本书是Effective Python的第2版,基于Python 3进行了全面升级。本书分为10章,包含90个条目,形式简洁、表述准确。每个条目都基于对Python的独到见解,告诉读者如何高效地编写Python程序。与第1版相比,第2版只关注Python 3,而不再兼顾Python 2。根据Python语言引入的新特性,以及Python开发者所形成的新经验,对第1版中的某些思路与解决方案进行了修订,以更好地发挥Python的优势。本书删除了过时的知识点,并添加了对Python新特性的一些介绍。新版中增加了31个条目,并专门设立了几章来强调列表和字典、推导和生成器、元类和属性、稳定性和性能,以及测试和调试等重要主题。 建议读者在阅读本书之前应对Python语言有初步的了解。对于有一定经验的开发者以及对Python编程感兴趣的读者,本书可以帮助其更深入地理解Python语言,以成为更卓越、高效的Python开发者。 作者简介 布雷特·斯拉特金(Brett Slatkin),GooqIe公司高级软件工程师。他是Google消费者调查项目的工程主管及联合创始人,曾从事Google App Engine的Python基础架构工作,并利用Python来管理众多的Google服务器。Slatkin也是PubSubHubbub协议的联合创始人,还用Python为GoogIe实现了针对该协议的系统。他拥有哥伦比亚大学计算机工程专业学士学位。 目录 第1章 Pythonic思维 条目1:查询自己使用的Python版本 条目2:遵循PEP 8风格指南 条目3:了解bytes和str之间的区别 条目4:使用支持插值的f-string取代C风格的格式化字符串和str.format 条目5:使用辅助函数取代复杂表达式 条目6:把数据结构直接拆分到多个变量里,避免通过下标访问 条目7:尽量用enumerate取代range 条目8:使用zip并行处理迭代器 条目9:避免在for和while循环后使用else块 条目10:使用赋值表达式减少重复代码 第2章 列表和字典 条目11:学会对序列做切片 条目12:避免在切片里同时指定起止下标和步进 条目13:通过带星号的unpacking操作来捕获多个元素,避免用切片 条目14:使用sort方法的key参数表示复杂的排序逻辑 条目15:不要过分依赖给dict添加条目时所用的顺序 条目16:使用get处理键不在字典中的情况,避免使用in与KeyError 条目17:使用defaultdict处理内部状态中觖失的元素,而避免使用setdefault 条目18:学会使用_missing_构建依赖键的默认值 第3章 函数 条目19:避免把函数返回的多个数值拆分到3个以上的变量中 条目20:遇到意外状况时应该抛出异常,而不是返回None 条目21:了解如何在闭包里面使用外围作用域中的变量 条目22:使用数量可变的位置参数给函数设计清晰的参数列表 条目23:使用关键字参数表示可选行为 条目24:使用None和文档字符串描述默认值会变的参数 条目25:使用只能以关键字指定和只能按位置传入的参数来设计清晰的参数列表 条目26:使用functools.wraps定义函数修饰器 第4章 推导和生成器 条目27:使用推导取代map和filter 条目28:在推导中避免超过两个控制子表达式 条目29:使用赋值表达式在推导中避免重复代码 条目30:考虑使用生成器而不是返回列表 条目31:谨慎地迭代函数所收到的参数 条目32:考虑使用生成器表达式来进行大型列表推导的组合 条目33:使用yield from组合多个生成器 条目34:避免使用send向生成器注入数据 条目35:避免通过throw变换生成器的状态 条目36:考虑使用itertools处理迭代器和生成器 第5章 类和接口 条目37:使用组合起来的类来实现多层结构,避免用嵌套的内置类型 条目38:接受函数而不是类来实现简单接口 条目39:通过@classmethod多态来构建同一体系中的各类对象 条目40:使用super初始化超类 条目41:考虑使用混合类来组合功能 条目42:优先考虑使用共有属性表示应受保护的数据,避免使用私有属性表示 条目43:使用collections.abc继承自定义容器类型 第6章 元类和属性 条目44:使用纯属性而不是setter和getter方法 条目45:考虑使用Gproperty而不是重构属性 条目46:使用描述符来改写需要复用的Eproperty方法 条目47:使用_getattr_、_getattribute_和_setattr_处理惰性属性 条目48:使用_init_subclass_验证子类 条目49:使用_init_subclass_记录现有的子类 条目50:使用_set_name_注释类属性 条目51:使用类修饰器而不是元类来实现可组合的类扩展 第7章 并发和并行 条目52:使用subprocess管理子进程 条目53:使用线程处理阻塞I/O,但避免使用它做并行计算 条目54:使用Lock避免线程中的数据竞争 条目55:使用Queue协调线程间的工作 条目56:学会判断何时需要并发 条目57:避免为按需分发创建新的Thread实例 条目58:学会正确地重构代码,以便用Queue做并发 条目59:在需要并发时考虑ThreadPoolExecutor 条目60:使用协程实现高并发I/O 条目61:了解如何将基于线程的I/O移植到asyncio 条目62:混合使用线程和协程以便过渡到asyncio 条目63:避免阻塞asyncio事件循环以最大化程序的响应能力 条目64:考虑concurrent.futures以实现真正的并行计算 第8章 稳定性和性能 条目65:充分利用try/except/else/finally结构中的每个代码块 条目66:考虑使用contextlib和with语句来改写可复用的try/finally代码 条目67:使用datetime模块而不是time模块处理本地时间 条目68:使用copyreg实现可靠的pickle操作 条目69:在需要准确计算时使用decimal表示相应的数值 条目70:在优化之前进行性能分析 条目71:优先考虑使用deque实现生产者-消费者队列 条目72:考虑使用bisect搜索排序序列 条目73:学会使用heapq制作优先级队列 条目74:考虑使用memoryview和bytearray来实现无须拷贝的bytes操作 第9章 测试和调试 条目75:使用repr字符串输出调试信息 条目76:通过TestCase子类验证相关行为 条目77:使用setUp、tearDown、setUpModule和tearDownModule将测试隔离开 条目78:使用Mock来模拟受测代码所依赖的复杂函数 条目79:封装依赖关系以便于模拟和测试 条目80:考虑使用pdb进行交互式调试 条目81:使用tracemalloc了解内存使用和泄漏情况 |