书籍详情

Python工匠:案例、技巧与工程实践(基于Python 3.8,实现从入门到工匠的跃迁)

Python工匠:案例、技巧与工程实践(基于Python 3.8,实现从入门到工匠的跃迁)

作者:朱雷(@piglei) 著

出版社:人民邮电出版社

出版时间:2022-03-01

ISBN:9787115584045

定价:¥99.80

购买这本书可以去
内容简介
  本书基于广受好评的“Python工匠”系列开源文章。全书从工程实践角度出发,通过剖析核心知识、展示典型案例与总结实用技巧,帮助大家系统进阶Python,写好工程代码,做好实践项目。本书共计13章,分为五大部分:变量与基础类型、语法结构、函数与装饰器、面向对象编程、总结与延伸,涵盖Python编程的方方面面。本书的写作方式别具一格,核心知识点都会通过三大板块来阐述:基础知识、案例故事、编程建议。其中基础知识帮助大家快速回顾Python基础;案例故事由作者经历的编程项目与案例改编而来,兼具实战性与趣味性;编程建议以大家喜闻乐见的条目式知识点呈现,短小精悍,可直接应用于自己的编程实践中。
作者简介
  朱雷(@piglei) 就职于腾讯IEG技术运营部,现任蓝鲸工具PaaS平台负责人,参与和主导了包括“蓝鲸工具PaaS平台”在内的诸多大型项目,从事后端开发与架构设计十余年,曾就职于搜狐、赶集网。 精通Python语言特性,对如何开发高质量的大型Python工程有独到见解。 从2016年开始创作“Python工匠”系列开源技术文章,其GitHub Star数超过4K,被“腾讯技术工程”等多家媒体全系列转载,收获诸多好评。 GitHub账号:piglei。公众号:piglei。
目录
前言 v

第 1章 变量与注释 1

1.1 基础知识 2

1.1.1 变量常见用法 2

1.1.2 给变量注明类型 4

1.1.3 变量命名原则 6

1.1.4 注释基础知识 11

1.2 案例故事 14

奇怪的冒泡排序算法 15

1.3 编程建议 17

1.3.1 保持变量的一致性 18

1.3.2 变量定义尽量靠近使用 18

1.3.3 定义临时变量提升可读性 20

1.3.4 同一作用域内不要有太多变量 21

1.3.5 能不定义变量就别定义 22

1.3.6 不要使用locals() 23

1.3.7 空行也是一种“注释” 24

1.3.8 先写注释,后写代码 25

1.4 总结 26

第 2章 数值与字符串 28

2.1 基础知识 29

2.1.1 数值基础 29

2.1.2 布尔值其实也是数字 31

2.1.3 字符串常用操作 31

2.1.4 不常用但特别好用的字符串方法 34

2.1.5 字符串与字节串 36

2.2 案例故事 39

2.2.1 代码里的“密码” 39

2.2.2 别轻易成为SQL语句“大师” 41

2.3 编程建议 44

2.3.1 不必预计算字面量表达式 44

2.3.2 使用特殊数字:“无穷大” 46

2.3.3 改善超长字符串的可读性 47

2.3.4 别忘了以r开头的字符串内置方法 48

2.3.5 不要害怕字符串拼接 49

2.4 总结 50

第3章 容器类型 53

3.1 基础知识 54

3.1.1 列表常用操作 54

3.1.2 理解列表的可变性 56

3.1.3 常用元组操作 60

3.1.4 具名元组 61

3.1.5 字典常用操作 63

3.1.6 认识字典的有序性与无序性 66

3.1.7 集合常用操作 68

3.1.8 了解对象的可哈希性 71

3.1.9 深拷贝与浅拷贝 72

3.2 案例故事 74

分析网站访问日志 75

3.3 编程建议 83

3.3.1 用按需返回替代容器 83

3.3.2 了解容器的底层实现 86

3.3.3 掌握如何快速合并字典 89

3.3.4 使用有序字典去重 91

3.3.5 别在遍历列表时同步修改 92

3.3.6 编写推导式的两个“不要” 92

3.3.7 让函数返回NamedTuple 94

3.4 总结 95

第4章 条件分支控制流 97

4.1 基础知识 98

4.1.1 分支惯用写法 98

4.1.2 修改对象的布尔值 101

4.1.3 与None比较时使用is运算符 103

4.2 案例故事 105

消失的分支 105

4.3 编程建议 112

4.3.1 尽量避免多层分支嵌套 112

4.3.2 别写太复杂的条件表达式 114

4.3.3 尽量降低分支内代码的相似性 115

4.3.4 使用“德摩根定律” 116

4.3.5 使用all()/any()函数构建条件表达式 117

4.3.6 留意and和or的运算优先级 118

4.3.7 避开or运算符的陷阱 118

4.4 总结 119

第5章 异常与错误处理 121

5.1 基础知识 122

5.1.1 优先使用异常捕获 122

5.1.2 try语句常用知识 124

5.1.3 抛出异常,而不是返回错误 127

5.1.4 使用上下文管理器 129

5.2 案例故事 133

5.2.1 提前崩溃也挺好 133

5.2.2 异常与抽象一致性 136

5.3 编程建议 139

5.3.1 不要随意忽略异常 139

5.3.2 不要手动做数据校验 140

5.3.3 抛出可区分的异常 142

5.3.4 不要使用assert来检查参数合法性 144

5.3.5 无须处理是最好的错误处理 145

5.4 总结 149

第6章 循环与可迭代对象 151

6.1 基础知识 152

6.1.1 迭代器与可迭代对象 152

6.1.2 修饰可迭代对象优化循环 158

6.1.3 使用itertools模块优化循环 160

6.1.4 循环语句的else关键字 162

6.2 案例故事 164

数字统计任务 164

6.3 编程建议 168

6.3.1 中断嵌套循环的正确方式 168

6.3.2 巧用next()函数 170

6.3.3 当心已被耗尽的迭代器 171

6.4 总结 172

第7章 函数 174

7.1 基础知识 175

7.1.1 函数参数的常用技巧 175

7.1.2 函数返回的常见模式 179

7.1.3 常用函数模块:functools 184

7.2 案例故事 187

函数与状态 187

7.3 编程建议 194

7.3.1 别写太复杂的函数 194

7.3.2 一个函数只包含一层抽象 196

7.3.3 优先使用列表推导式 203

7.3.4 你没有那么需要lambda 204

7.3.5 了解递归的局限性 205

7.4 总结 207

第8章 装饰器 209

8.1 基础知识 211

8.1.1 装饰器基础 211

8.1.2 使用functools.wraps()修饰包装函数 213

8.1.3 实现可选参数装饰器 215

8.1.4 用类来实现装饰器(函数替换) 217

8.1.5 用类来实现装饰器(实例替换) 219

8.1.6 使用wrapt模块助力装饰器编写 221

8.2 编程建议 223

8.2.1 了解装饰器的本质优势 223

8.2.2 使用类装饰器替代元类 225

8.2.3 别弄混装饰器和装饰器模式 226

8.2.4 浅装饰器,深实现 227

8.3 总结 228

第9章 面向对象编程 230

9.1 基础知识 232

9.1.1 类常用知识 232

9.1.2 内置类方法装饰器 235

9.1.3 鸭子类型及其局限性 239

9.1.4 抽象类 242

9.1.5 多重继承与MRO 248

9.1.6 其他知识 251

9.2 案例故事 255

继承是把双刃剑 255

9.3 编程建议 265

9.3.1 使用__init_subclass__替代元类 265

9.3.2 在分支中寻找多态的应用时机 266

9.3.3 有序组织你的类方法 268

9.3.4 函数搭配,干活不累 270

9.4 总结 274

第 10章 面向对象设计原则(上) 276

10.1 类型注解基础 278

10.2 SRP:单一职责原则 279

10.2.1 案例:一个简单的Hacker News爬虫 280

10.2.2 违反SRP的坏处 283

10.2.3 大类拆小类 284

10.3 OCP:开放-关闭原则 285

10.3.1 接受OCP的考验 286

10.3.2 通过继承改造代码 288

10.3.3 使用组合与依赖注入 289

10.3.4 使用数据驱动 292

10.4 总结 294

第 11章 面向对象设计原则(下) 295

11.1 LSP:里式替换原则 296

11.1.1 子类随意抛出异常 296

11.1.2 子类随意调整方法参数与返回值 300

11.1.3 基于隐式合约违反LSP 304

11.1.4 LSP小结 306

11.2 DIP:依赖倒置原则 306

11.2.1 案例:按来源统计Hacker News条目数量 307

11.2.2 为脚本编写单元测试 309

11.2.3 实现DIP 311

11.2.4 倒置后的单元测试 314

11.2.5 DIP小结 315

11.3 ISP:接口隔离原则 317

11.3.1 案例:处理页面归档需求 317

11.3.2 修改实体类 318

11.3.3 违反ISP 320

11.3.4 分拆接口 320

11.3.5 其他违反ISP的场景 322

11.4 总结 322

第 12章 数据模型与描述符 324

12.1 基础知识 326

12.1.1 字符串魔法方法 326

12.1.2 比较运算符重载 329

12.1.3 描述符 332

12.2 案例故事 341

处理旅游数据的三种方案 341

12.3 编程建议 350

12.3.1 认识__hash__的危险性 350

12.3.2 数据模型不是“躺赢”之道 351

12.3.3 不要依赖__del__方法 353

12.4 总结 354

第 13章 开发大型项目 356

13.1 常用工具介绍 357

13.1.1 flake8 357

13.1.2 isort 360

13.1.3 black 361

13.1.4 pre-commit 364

13.1.5 mypy 365

13.2 单元测试简介 366

13.2.1 unittest 367

13.2.2 pytest 369

13.3 有关单元测试的建议 375

13.3.1 写单元测试不是浪费时间 375

13.3.2 不要总想着“补”测试 377

13.3.3 难测试的代码就是烂代码 378

13.3.4 像应用代码一样对待测试代码 379

13.3.5 避免教条主义 380

13.4 总结 381

结语 383
猜您喜欢

读书导航