[套装书]Effective Python:编写高质量Python代码的90个有效方法(原书第2版)+Python代码整洁之道:编写优雅的代码(2册)

作者
布雷特·斯拉特金 苏尼尔·卡皮尔
丛书名
Effective系列丛书
出版社
机械工业出版社
ISBN
9782102031571
简要
简介
内容简介书籍计算机书籍 ---------------------------Effective Python:编写高质量Python代码的90个有效方法(原书第2版)--------------------------- 本书可以帮你掌握真正的Pythonic编程方式,令你能够完全发挥出Python语言的强大功能,并写出健壮而高效的代码。Scott Meyers在畅销书《Effective C++》中开创了一种以使用场景为主导的精练教学方式,本书作者Brett Slatkin就以这种方式汇聚了90条实践原则、开发技巧和便捷方案,并以实用的代码范例来解释它们。 Slatkin根据自己在Google公司多年开发Python基础架构所积累的经验,揭示Python语言中一些鲜为人知的微妙特性,并给出了能够改善代码功能及运行效率的习惯用法。通过本书,你能够了解到解决关键编程任务所用的奇妙方式,并学会编写易于理解、便于维护且利于改进的代码。 ---------------------------Python代码整洁之道:编写优雅的代码--------------------------- 本书首先介绍格式化编码和代码记录以获得最大可读性的重要性,使用内置数据结构和Python字典提高可维护性,并使用模块和元类有效地组织代码。然后深入研究Python语言的新特性,并学习如何有效地利用它们。接下来,将解码诸如异步编程、Python数据类型、类型提示和路径处理等关键概念。学习在Python代码中调试和执行单元测试和集成测试的技巧,以确保代码可以投入生产。最后介绍用于版本管理、管理实时代码和智能代码完成的必要工具。
目录



---------------------------Effective Python:编写高质量Python代码的90个有效方法(原书第2版)---------------------------


本书赞誉
译者序
前言
致谢
第1章 培养Pythonic思维  1
第1条 查询自己使用的Python版本  1
第2条 遵循PEP 8风格指南  2
第3条 了解bytes与str的区别  5
第4条 用支持插值的f-string取代C风格的格式字符串与str.format方法  9
第5条 用辅助函数取代复杂的表达式  19
第6条 把数据结构直接拆分到多个变量里,不要专门通过下标访问  21
第7条 尽量用enumerate取代range  25
第8条 用zip函数同时遍历两个迭代器  26
第9条 不要在for与while循环后面写else块  28
第10条 用赋值表达式减少重复代码  31
第2章 列表与字典  37
第11条 学会对序列做切片  37
第12条 不要在切片里同时指定起止下标与步进  40
第13条 通过带星号的unpacking操作来捕获多个元素,不要用切片  42
第14条 用sort方法的key参数来表示复杂的排序逻辑  45
第15条 不要过分依赖给字典添加条目时所用的顺序  51
第16条 用get处理键不在字典中的情况,不要使用in与KeyError  56
第17条 用defaultdict处理内部状态中缺失的元素,而不要用setdefault  61
第18条 学会利用__missing__构造依赖键的默认值  63
第3章 函数  66
第19条 不要把函数返回的多个数值拆分到三个以上的变量中  66
第20条 遇到意外状况时应该抛出异常,不要返回None  69
第21条 了解如何在闭包里面使用外围作用域中的变量  71
第22条 用数量可变的位置参数给函数设计清晰的参数列表  75
第23条 用关键字参数来表示可选的行为  77
第24条 用None和docstring来描述默认值会变的参数  80
第25条 用只能以关键字指定和只能按位置传入的参数来设计清晰的参数列表  83
第26条 用functools.wraps定义函数修饰器  88
第4章 推导与生成  91
第27条 用列表推导取代map与filter  91
第28条 控制推导逻辑的子表达式不要超过两个  93
第29条 用赋值表达式消除推导中的重复代码  94
第30条 不要让函数直接返回列表,应该让它逐个生成列表里的值  97
第31条 谨慎地迭代函数所收到的参数  100
第32条 考虑用生成器表达式改写数据量较大的列表推导  104
第33条 通过yield from把多个生成器连起来用  106
第34条 不要用send给生成器注入数据  108
第35条 不要通过throw变换生成器的状态  113
第36条 考虑用itertools拼装迭代器与生成器  117
第5章 类与接口  122
第37条 用组合起来的类来实现多层结构,不要用嵌套的内置类型  122
第38条 让简单的接口接受函数,而不是类的实例  128
第39条 通过@classmethod多态来构造同一体系中的各类对象  131
第40条 通过super初始化超类  136
第41条 考虑用mix-in类来表示可组合的功能  140
第42条 优先考虑用public属性表示应受保护的数据,不要用private属性表示  144
第43条 自定义的容器类型应该从collections.abc继承  149
第6章 元类与属性  153
第44条 用纯属性与修饰器取代旧式的setter与getter方法  153
第45条 考虑用@property实现新的属性访问逻辑,不要急着重构原有的代码  157
第46条 用描述符来改写需要复用的@property方法  160
第47条 针对惰性属性使用__getattr__、__getattribute__及__setattr__  165
第48条 用__init_subclass__验证子类写得是否正确  170
第49条 用__init_subclass__记录现有的子类  177
第50条 用__set_name__给类属性加注解  181
第51条 优先考虑通过类修饰器来提供可组合的扩充功能,不要使用元类  185
第7章 并发与并行  191
第52条 用subprocess管理子进程  192
第53条 可以用线程执行阻塞式I/O,但不要用它做并行计算  195
第54条 利用Lock防止多个线程争用同一份数据  199
第55条 用Queue来协调各线程之间的工作进度  202
第56条 学会判断什么场合必须做并发  210
第57条 不要在每次fan-out时都新建一批Thread实例  214
第58条 学会正确地重构代码,以便用Queue做并发  218
第59条 如果必须用线程做并发,那就考虑通过ThreadPoolExecutor实现  224
第60条 用协程实现高并发的I/O  226
第61条 学会用asyncio改写那些通过线程实现的I/O  230
第62条 结合线程与协程,将代码顺利迁移到asyncio  239
第63条 让asyncio的事件循环保持畅通,以便进一步提升程序的响应能力  245
第64条 考虑用concurrent.futures实现真正的并行计算  248
第8章 稳定与性能  253
第65条 合理利用try/except/else/finally结构中的每个代码块  253
第66条 考虑用contextlib和with语句来改写可复用的try/finally代码  258
第67条 用datetime模块处理本地时间,不要用time模块  262
第68条 用copyreg实现可靠的pickle操作  265
第69条 在需要准确计算的场合,用decimal表示相应的数值  272
第70条 先分析性能,然后再优化  274
第71条 优先考虑用deque实现生产者-消费者队列  278
第72条 考虑用bisect搜索已排序的序列  284
第73条 学会使用heapq制作优先级队列  286
第74条 考虑用memoryview与bytearray来实现无须拷贝的bytes操作  294
第9章 测试与调试  300
第75条 通过repr字符串输出调试信息  301
第76条 在TestCase子类里验证相关的行为  304
第77条 把测试前、后的准备与清理逻辑写在setUp、tearDown、setUpModule与tearDownModule中,以防用例之间互相干扰  309
第78条 用Mock来模拟受测代码所依赖的复杂函数  312
第79条 把受测代码所依赖的系统封装起来,以便于模拟和测试  319
第80条 考虑用pdb做交互调试  322
第81条 用tracemalloc来掌握内存的使用与泄漏情况  326
第10章 协作开发  329
第82条 学会寻找由其他Python开发者所构建的模块  329
第83条 用虚拟环境隔离项目,并重建依赖关系  330
第84条 每一个函数、类与模块都要写docstring  335
第85条 用包来安排模块,以提供稳固的API  339
第86条 考虑用模块级别的代码配置不同的部署环境  344
第87条 为自编的模块定义根异常,让调用者能够专门处理与此API有关的异常  346
第88条 用适当的方式打破循环依赖关系  350
第89条 重构时考虑通过warnings提醒开发者API已经发生变化  355
第90条 考虑通过typing做静态分析,以消除bug  361



---------------------------Python代码整洁之道:编写优雅的代码---------------------------


译者序
前言
致谢
关于作者
关于技术审校者
第1章 关于Python的思考1
1.1 编写Python代码1
1.1.1 命名2
1.1.2 代码中的表达式和语句5
1.1.3 拥抱Python编写代码的方式8
1.2 使用文档字符串14
1.2.1 模块级文档字符串17
1.2.2 使类文档字符串具有描述性17
1.2.3 函数文档字符串18
1.2.4 一些有用的文档字符串工具19
1.3 编写Python的控制结构20
1.3.1 使用列表推导20
1.3.2 不要使用复杂的列表推导21
1.3.3 应该使用lambda吗23
1.3.4 何时使用生成器与何时使用列表推导23
1.3.5 为什么不要在循环中使用else24
1.3.6 为什么range函数在Python 3中更好27
1.4 引发异常28
1.4.1 习惯引发异常28
1.4.2 使用finally来处理异常30
1.4.3 创建自己的异常类31
1.4.4 只处理特定的异常32
1.4.5 小心第三方的异常34
1.4.6 try最少的代码块35
1.5 小结36
第2章 数据结构38
2.1 常用数据结构38
2.1.1 使用集合38
2.1.2 返回和访问数据时使用namedtuple40
2.1.3 理解str、Unicode和byte43
2.1.4 谨慎使用列表,优先使用生成器44
2.1.5 使用zip处理列表47
2.1.6 使用Python的内置函数48
2.2 使用字典50
2.2.1 何时使用字典与何时使用其他数据结构51
2.2.2 collections51
2.2.3 有序字典、默认字典、普通字典54
2.2.4 使用字典的switch语句55
2.2.5 合并两个字典的方法56
2.2.6 优雅地打印字典57
2.3 小结58
第3章 编写更好的函数和类59
3.1 函数59
3.1.1 编写小函数60
3.1.2 返回生成器61
3.1.3 引发异常替代返回None63
3.1.4 使用默认参数和关键字参数64
3.1.5 不要显式地返回None66
3.1.6 编写函数时注意防御68
3.1.7 单独使用lambda表达式70
3.2 类72
3.2.1 类的大小72
3.2.2 类结构73
3.2.3 正确地使用@property75
3.2.4 什么时候使用静态方法77
3.2.5 继承抽象类79
3.2.6 使用@classmethod来访问类的状态80
3.2.7 使用公有属性代替私有属性81
3.3 小结83
第4章 使用模块和元类84
4.1 模块和元类84
4.2 如何使用模块组织代码86
4.3 使用__init__文件88
4.4 以正确的方式从模块导入函数和类90
4.5 何时使用元类92
4.6 使用__new__方法验证子类93
4.7 __slots__的用途95
4.8 使用元类改变类的行为98
4.9 Python描述符100
4.10 小结102
第5章 装饰器和上下文管理器104
5.1 装饰器105
5.1.1 装饰器及其作用105
5.1.2 理解装饰器106
5.1.3 使用装饰器更改行为108
5.1.4 同时使用多个装饰器110
5.1.5 使用带参数的装饰器111
5.1.6 考虑使用装饰器库112
5.1.7 用于维护状态和验证参数的类装饰器114
5.2 上下文管理器117
5.2.1 上下文管理器及用途117
5.2.2 理解上下文管理器119
5.2.3 使用contextlib创建上下文管理器120
5.2.4 上下文管理器的示例121
5.3 小结124
第6章 生成器与迭代器125
6.1 使用生成器和迭代器125
6.1.1 理解迭代器125
6.1.2 什么是生成器128
6.1.3 何时使用迭代器129
6.1.4 使用itertools130
6.1.5 为什么生成器非常有用132
6.1.6 列表推导和迭代器133
6.2 使用yield关键字133
6.2.1 yield from135
6.2.2 yield相比数据结构更快135
6.3 小结136
第7章 使用Python的新特性137
7.1 异步编程137
7.1.1 Python中的async138
7.1.2 asyncio是如何工作的141
7.1.3 异步生成器151
7.2 类型标注159
7.2.1 Python中的类型160
7.2.2 typing模块160
7.2.3 类型检查会影响性能吗163
7.2.4 类型标注如何帮助编写更好的代码163
7.2.5 typing的陷阱163
7.3 super()方法164
7.4 类型提示164
7.5 使用pathlib处理路径164
7.6 print()现在是一个函数165
7.7 f-string165
7.8 关键字参数166
7.9 保持字典数据的顺序166
7.10 迭代解包166
7.11 小结167
第8章 调试和测试Python代码168
8.1 调试168
8.1.1 调试工具169
8.1.2 breakpoint172
8.1.3 在产品代码中使用logging模块替代print172
8.1.4 使用metrics库来分析性能瓶颈177
8.1.5 IPython有什么帮助178
8.2 测试179
8.2.1 测试非常重要179
8.2.2 Pytest和UnitTest180
8.2.3 属性测试184
8.2.4 生成测试报告184
8.2.5 自动化单元测试185
8.2.6 让代码为生产做好准备186
8.2.7 在Python中执行单元和集成测试186
8.3 小结189
附录 一些很棒的Python工具190

推荐

车牌查询
桂ICP备20004708号-3