编辑推荐
适读人群 :你已经了解Python语言的基础和面向对象编程吗? 你想更进一步钻研、学习技术来让你的Python应用更具健壮性、可扩展性并更加高效吗? 如果是这样的话,那么这本书就是为你量身打造的。
Python是使用广泛的动态编程语言之一。它支持一组丰富的库和框架,从而能够用来进行快速开发。但是,如此快速的开发通常会带来一些问题,容易导致代码整体质量、性能和扩展性的降低。本书将会教你如何处理这些问题,以及如何编写出更好的Python应用程序。
本书从简单命令行应用程序的基础知识入手,帮助读者不断提高技能,直到可以设计出高效的、高级的Python应用。本书使用轻松奇幻的学习主线,用具体解决方案来应对在复杂的Python开发中遇到的实际问题。读者从关注健壮性,以及程序代码的打包和发布开始,通过提高代码的可扩展性、可重用性以及可读性来提高应用程序的生命周期,并掌握Python代码重构、设计模式。在关于性能的章节中,读者学会识别性能瓶颈并提升性能,最后还将学习如何开发Python图形界面应用程序。
通过阅读本书,您将能够:
● 通过异常处理来创建健壮的应用程序。
● 源代码的模块化、打包和发布。
● 编写代码文档,实施代码规范。
● 在开发初期通过创建自动化测试发现程序漏洞。
● 识别并重构糟糕的代码以扩大应用的生命周期。
● 检测代码中重复出现的问题并使用设计模式。
● 通过识别性能瓶颈并修复问题来提高代码执行效率。
● 使用Python开发简单的图形界面应用程序。
内容简介
Python是使用较多的动态编程语言之一,应用广泛,学习者众多。
本书使用一个生动有趣的、基于文本的游戏主题作为讲解内容来介绍Python应用开发过程的各个方面。全书共10章,涉及简单应用开发、模块化、打包和发布应用的代码、文档规范、单元测试、重构、设计模式、性能监测、性能优化、GUI应用、MVC框架等方方面面的软件开发知识和技能。
本书适合有一定Python语言基础,想要快速掌握Python项目开发知识、提高Python开发实战技能的读者学习参考。
作者简介
在Ninad Sathaye的职业生涯中,他有多年使用包括Python和C++在内的多种语言设计和开发性能关键应用的经验。他曾是半导体行业中的一个软件架构师,最近又转入物联网领域。他拥有机械工程硕士学位。
目录
- 第1章开发简单应用 1
- 1.1 重要提示 2
- 1.2 安装的先决条件 2
- 1.2.1 安装Python 3
- 1.3 本书的主题 8
- 1.3.1 了解本书人物 8
- 1.4 简单的脚本—兽人之袭
- v0.0.1 9
- 1.4.1 游戏简介—兽人之袭
- v0.0.1 10
- 1.4.2 问题说明 10
- 1.4.3 伪代码—0.0.1版本 10
- 1.4.4 代码查看 11
- 1.4.5 运行兽人之袭v0.0.1 14
- 1.5 使用函数—兽人之袭
- v0.0.5 14
- 1.5.1 重新回顾以前的版本 15
- 1.5.2 有攻击功能的伪代码—版本0.0.5 17
- 1.5.3 代码查看 19
- 1.5.4 运行兽人之袭v0.0.5 21
- 1.6 使用面向对象编程—兽人之袭v1.0.0 22
- 1.6.1 功能需求的优先度 23
- 1.6.2 问题说明 24
- 1.6.3 重新设计代码 24
- 1.6.4 描绘整个场景 25
- 1.6.5 代码查看 27
- 1.6.6 运行兽人之袭v1.0.0 31
- 1.7 Python中的抽象基类 32
- 1.7.1 练习 33
- 1.8 小结 34
- 1.8.1 对电子书读者非常重要的提示 34
- 第2章异常处理 36
- 2.1 修改兽人之袭v1.0.0 36
- 2.1.1 问题调试 37
- 2.1.2 bug修复中…… 38
- 2.2 异常 39
- 2.2.1 什么是异常 39
- 2.2.2 最常见的异常 39
- 2.2.3 异常处理 40
- 2.2.4 异常的抛出和再抛出 42
- 2.2.5 try...except的else代码块 43
- 2.2.6 finally...清理吧 44
- 2.3 回归游戏—兽人之袭
- v1.1.0 45
- 2.3.1 准备工作 45
- 2.3.2 增加异常处理代码 46
- 2.3.3 运行兽人之袭v1.1.0 47
- 2.4 自定义异常 48
- 2.4.1 准备工作 48
- 2.4.2 自定义异常— 问题所在 49
- 2.4.3 编写一个新的异常类 50
- 2.4.4 扩展异常类 51
- 2.4.5 继承exception类 53
- 2.5 练习 55
- 2.6 小结 56
- 第3章 模块化、包和部署 57
- 3.1 选择一种版本控制规约 58
- 3.1.1 连续递增 58
- 3.1.2 使用日期格式 59
- 3.1.3 语义版本控制方案 59
- 3.2 代码模块化 60
- 3.2.1 兽人之袭v2.0.0 60
- 3.3 创建Python包 62
- 3.3.1 从包中录入 63
- 3.4 在PyPI上发布包 64
- 3.4.1 发行版本准备 65
- 3.4.2 上传发行版 69
- 3.4.3 一条命令完成所有的 事情 73
- 3.4.4 安装你自己的发行版 73
- 3.5 使用私有的PyPI仓库 75
- 3.5.1 步骤1—安装 pypiserver 75
- 3.5.2 步骤2—创建一个新的 源代码发行版 75
- 3.5.3 步骤3—启动本地 服务器 76
- 3.5.4 步骤4—安装私有 发行版 76
- 3.6 创建增量发布 77
- 3.6.1 打包并上传新版本 77
- 3.6.2 升级已经安装的版本 77
- 3.7 代码的版本控制 78
- 3.7.1 Git资源 78
- 3.7.2 安装Git 78
- 3.7.3 配置你的验证信息 79
- 3.7.4 Git基础术语 79
- 3.7.5 创建并使用本地仓库 80
- 3.8 使用Git的GUI客户端 83
- 3.9 练习 84
- 3.10 小结 85
- 第4章 代码文档和最佳实践 86
- 4.1 编写代码文档 87
- 4.1.1 文档字符串 88
- 4.1.2 reStructuredText简介 89
- 4.1.3 使用RST的文档 字符串 92
- 4.1.4 文档字符串格式化风格 94
- 4.1.5 自动生成文档字符串 stubs 95
- 4.1.6 使用Sphinx生成文档 97
- 4.2 Python编码标准 103
- 4.3 代码分析—我们做得 怎么样呢 105
- 4.3.1 使用IDE进行代码 分析 105
- 4.3.2 Pylint 106
- 4.4 练习 110
- 4.5 小结 110
- 第5章 单元测试和重构 111
- 5.1 本章的组织方式 111
- 5.1.1 重要说明 112
- 5.2 为何要进行测试 112
- 5.2.1 提出了一个新的需求 112
- 5.2.2 你实现了这个功能 113
- 5.2.3 但是有些事情似乎 不对了…… 114
- 5.2.4 它需要完全测试 115
- 5.3 单元测试 115
- 5.3.1 Python的unittest 框架 116
- 5.4 为应用程序编写单元测试 121
- 5.4.1 创建测试包 121
- 5.4.2 为单元测试创建新 的类 122
- 5.4.3 第1个单元测试— 受伤方的选择 123
- 5.4.4 运行第1个单元测试 124
- 5.4.5 第2个单元测试— 占领木屋 124
- 5.4.6 创建自己的测试模块 127
- 5.4.7 批量执行单元测试 127
- 5.5 使用模拟库的单元测试 128
- 5.5.1 Mock的简介 128
- 5.5.2 让我们开始Mock吧 129
- 5.5.3 在单元测试中使用Mock 对象 131
- 5.5.4 使用补丁 133
- 5.5.5 第3个单元测试— play方法 135
- 5.6 你的代码被覆盖到了吗 139
- 5.6.1 解决导入错误 140
- 5.7 其他单元测试工具 141
- 5.7.1 Doctest 141
- 5.7.2 Nose 141
- 5.7.3 Pytest 142
- 5.8 重构的前言 142
- 5.8.1 绕个弯路—可测试性重构 144
- 5.9 重构 144
- 5.9.1 什么是重构 145
- 5.9.2 为什么要进行重构 145
- 5.9.3 何时进行重构 145
- 5.9.4 如何进行重构 146
- 5.9.5 移动 148
- 5.10 重新审视单元测试 150
- 5.10.1 可测试化重构 150
- 5.10.2 第4个单元测试— setup_game_scenario 152
- 5.11 练习 152
- 5.11.1 重构和重新设计练习 153
- 5.12 小结 153
- 第6章 设计模式 154
- 6.1 设计模式的介绍 154
- 6.1.1 设计模式的分类 155
- 6.2 Python语言和设计模式 156
- 6.2.1 一级函数 157
- 6.2.2 类作为一级对象 157
- 6.2.3 闭包 158
- 6.2.4 各种特性 159
- 6.2.5 鸭子类型 160
- 6.3 本章余下内容的结构 161
- 6.4 快进—兽人之袭
- v6.0.0 162
- 6.5 策略模式 164
- 6.5.1 策略场景—跳跃 特性 164
- 6.5.2 策略—主要的问题 165
- 6.5.3 策略—尝试解决 方案 166
- 6.5.4 策略—重新考虑 设计 168
- 6.5.5 策略方案1— 传统方法 169
- 6.5.6 策略方案2— Python方法 172
- 6.6 简单工厂 174
- 6.6.1 简单工厂场景— 招募特性 174
- 6.6.2 简单工厂— 主要的问题 175
- 6.6.3 简单工厂—重新 考虑设计 176
- 6.6.4 简单工厂方案1— 传统方法 177
- 6.6.5 简单工厂方案2— Python方法 178
- 6.7 抽象工厂模式 180
- 6.7.1 抽象工厂场景— 饰品店 181
- 6.7.2 抽象工厂—主要的 问题 184
- 6.7.3 抽象工厂—重新考虑 设计 184
- 6.7.4 抽象工厂方案— Python方法 186
- 6.8 适配器模式 188
- 6.8.1 适配器模型—精灵的 远房亲戚 189
- 6.8.2 适配器—主要的 问题 189
- 6.8.3 适配器—尝试解决 方案 190
- 6.8.4 适配器解决方案— Python方法 191
- 6.9 小结 194
- 第7章 性能—识别瓶颈 195
- 7.1 三个性能章节的总览 195
- 7.1.1 更注重运行时的性能 195
- 7.1.2 关于性能的第1个 章节 196
- 7.1.3 关于性能的第2个 章节 196
- 7.1.4 关于性能的第3个 章节 196
- 7.1.5 看一下应用性能提升 196
- 7.2 游戏场景—寻找黄金 197
- 7.2.1 顶层算法 199
- 7.2.2 查看最初的代码 200
- 7.2.3 运行代码 202
- 7.3 主要的问题 203
- 7.4 识别瓶颈 204
- 7.4.1 衡量执行时间 204
- 7.4.2 监测代码片段的运行 时间 205
- 7.4.3 代码分析 206
- 7.5 内存分析 212
- 7.5.1 memory_profiler包 212
- 7.6 算法效率和复杂度 214
- 7.6.1 算法效率 214
- 7.6.2 算法复杂度 214
- 7.7 大O符号 214
- 7.7.1 大O复杂类 215
- 7.8 小结 221
- 第8章 性能优化1 222
- 8.1 本章的前提 223
- 8.2 本章的组织方式 223
- 8.3 回顾“寻找黄金”的场景 224
- 8.3.1 选择问题的数据大小 224
- 8.3.2 分析最初的代码 224
- 8.4 优化“寻找黄金”—
- 第1部分 225
- 8.4.1 调整算法—平方根 225
- 8.4.2 跳过点操作符 228
- 8.4.3 使用本地范围 230
- 8.5 性能优化的一些事项 232
- 8.5.1 列表推导式 233
- 8.5.2 记录执行时间 234
- 8.5.3 字典推导式 235
- 8.5.4 交换条件块和for 循环 235
- 8.5.5 在循环中使用try语句 236
- 8.5.6 选择正确的数据结构 237
- 8.5.7 collections模块 238
- 8.5.8 生成器和生成器 表达式 241
- 8.5.9 itertools模块 245
- 8.6 练习 247
- 8.7 小结 247
- 第9章 性能优化2—NumPy和 并行化 248
- 9.1 本章的先决条件 248
- 9.2 本章的组织方式 248
- 9.3 NumPy的简介 249
- 9.3.1 安装NumPy 250
- 9.3.2 创建数组对象 250
- 9.3.3 简单的数组操作 251
- 9.3.4 数组切割和索引 252
- 9.3.5 广播 254
- 9.3.6 其他功能 255
- 9.3.7 从哪里能获得更多关于 NumPy的信息 262
- 9.4 优化“寻找黄金”—
- 第2部分 262
- 9.4.1 “寻找黄金”优化— 优化四 262
- 9.4.2 “寻找黄金”优化— 优化五 264
- 9.5 使用multiprocessing模块的 并行化 267
- 9.5.1 并行化简介 267
- 9.5.2 全局解释器锁 268
- 9.5.3 multiprocessing模块 268
- 9.6 “寻找黄金”程序并行化 271
- 9.6.1 重访黄金领地 271
- 9.6.2 “寻找黄金”优化— 优化六,并行化 273
- 9.7 进一步阅读 277
- 9.7.1 JIT编译器 277
- 9.8 小结 278
- 第10章简单的图形应用程序 280
- 10.1 GUI框架概述 281
- 10.1.1 Tkinter 281
- 10.1.2 PyQt 281
- 10.1.3 PySide 282
- 10.1.4 Kivy 282
- 10.1.5 wxPython 282
- 10.2 GUI编程设计注意事项 283
- 10.2.1 了解用户的需求 283
- 10.2.2 开发用户故事 283
- 10.2.3 简单性和可访问性 283
- 10.2.4 一致性 284
- 10.2.5 可预测性和熟悉性 284
- 10.2.6 其他设计考虑 284
- 10.3 事件驱动编程 284
- 10.3.1 事件 285
- 10.3.2 事件处理 285
- 10.3.3 事件循环 285
- 10.4 使用Tkinter进行GUI 编程 286
- 10.4.1 Tkinter的文件链接 286
- 10.4.2 Tkinter中的 mainloop() 286
- 10.4.3 简单GUI应用程序—
- 第1步 287
- 10.4.4 简单GUI应用程序—
- 第2步 289
- 10.4.5 Tkinter中的GUI
- 控件 290
- 10.4.6 布局管理 292
- 10.4.7 Tkinter中的事件 294
- 10.4.8 Tkinter中的事件 处理 296
- 10.5 项目1—兽人之袭
- v10.0.0 298
- 10.5.1 游戏场景 298
- 10.5.2 问题声明 298
- 10.5.3 编写代码 299
- 10.5.4 运行应用程序 305
- 10.6 MVC架构 306
- 10.6.1 模型 307
- 10.6.2 视图 307
- 10.6.3 控制器 307
- 10.6.4 MVC的好处 308
- 10.7 项目2—兽人之袭
- v10.1.0 308
- 10.7.1 重新修改HutGame类 308
- 10.7.2 创建MVC类 309
- 10.7.3 MVC对象间的通信 310
- 10.7.4 查看代码 314
- 10.7.5 Model类 315
- 10.7.6 View类 316
- 10.7.7 运行应用程序 317
- 10.8 测试GUI应用程序 317
- 10.8.1 测试注意事项 318
- 10.9 练习 319
- 10.10 扩展阅读 320
- 10.11 小结 322