作者 |
刘宇宙,谢东,刘艳 布雷特·斯拉特金 |
丛书名 |
出版社 |
机械工业出版社 |
ISBN |
9782104161035 |
简要 |
简介 |
内容简介书籍计算机书籍 ---------------------------8079864 - Python进阶编程:编写更高效、优雅的Python代码--------------------------- 内容简介 本书将帮助读者系统掌握编写高效、优雅的Python代码的方法,快速成长为一位高水平的Python开发工程师。 作者是Python编程领域的资深开发工程师,有多年的Python开发经验,本书得到了行业里15位技术专家的高度评价。 为了帮助读者编写出高效的Python代码,本书不仅从源代码的角度系统地讲解了Python的语法,让读者能知其然并知其所以然,而且结合具体的应用需求,对并发编程、性能优化、测试与调试、异常处理、内存管理等Python开发中的高级知识进行了详细的讲解。 为了指导读者编写出更优雅的Python代码,本书针对具体问题给出了大量的实例代码并给出了编码风格上的方法和建议。 如果你是没有Python编程经验的新人,你将通过本书系统掌握Python语法及其背后的原理,并从一开始就养成良好的编码习惯;如果你是有一定Python编程经验的老手,你将通过本书掌握各种Python编程中的高级知识,同时领略到优雅的编码风格和技巧。 ---------------------------8078189 - Effective Python:编写高质量Python代码的90个有效方法(原书第2版)--------------------------- 本书能够帮你掌握真正的 Pythonic 编程方式,充分发挥 Python 的优势,写出健壮而高效的代码。Scott Meyers在其名著Effective C++中开创了一种用简明的场景实例来讲述编程经验的方式,本书作者Brett Slatkin也沿用这种方式,向大家讲解 Python 的编程原则、开发技巧与便捷方案,形成 90 条建议并配有实用的范例代码,以便大家能够扎实地掌握 Python 语言。 【本书的关键内容包括】: ● 31 条新的实用建议,这些建议涵盖 Python 开发的几个主要方面。 . ● 对各种语句、表达式与内置类型做了详细讲解与演示。 ● 怎样写出意图清晰、便于复用而且不容易出现 bug 的函数。 ● 怎样更好地使用推导机制与生成器函数。 ● 怎样用类与接口准确展示相关的行为。 ● 怎样避开元类与动态属性中的一些陷阱。 ● 怎样用更高效且更清晰的方法写出并发与并行程序。 ● 怎样优化程序性能并提升代码质量。 ● 用于改进调试与测试工作的技术与内置模块。 ● 与协作开发有关的工具和经验。 |
目录 |
[套装书具体书目] 8078189 - Effective Python:编写高质量Python代码的90个有效方法(原书第2版) - 9787111674023 - 机械工业出版社 - 定价 129 8079864 - Python进阶编程:编写更高效、优雅的Python代码 - 9787111678502 - 机械工业出版社 - 定价 129 ---------------------------8079864 - Python进阶编程:编写更高效、优雅的Python代码--------------------------- 推荐语 推荐序一 推荐序二 前言 第0章 Python总览 1 0.1 Python总体架构 1 0.2 Python源码组织 2 0.3 Python对象初探 3 0.3.1 Python内的对象 3 0.3.2 对象的分类 4 0.3.3 对象机制的基石—PyObject 5 0.3.4 定长对象和变长对象 5 0.3.5 类型对象 6 0.3.6 类型的类型 7 0.3.7 对象的创建 8 0.3.8 对象的行为 8 0.3.9 对象的多态性 9 0.3.10 引用计数 10 0.4 本章小结 11 第1章 数字对象 12 1.1 整数对象 12 1.1.1 PyLongObject对象 12 1.1.2 小整数对象 14 1.1.3 大整数对象 14 1.2 数字格式化输出 14 1.3 进制转换 16 1.4 数字运算 17 1.4.1 四舍五入运算 17 1.4.2 浮点数运算 19 1.4.3 复数运算 20 1.4.4 分数运算 22 1.4.5 大型数组运算 22 1.4.6 矩阵与线性代数运算 25 1.5 字节到大整数的打包与解包 27 1.6 无穷大与NaN 28 1.7 随机数 30 1.8 本章小结 32 第2章 字符串 33 2.1 字符串对象解析 33 2.1.1 字符串对象的intern机制 33 2.1.2 字符串操作效率 34 2.2 字符串操作 35 2.2.1 字符串分割 35 2.2.2 删除不需要的字符 36 2.2.3 字符串清理 37 2.2.4 字符串对齐 39 2.2.5 字符串拼接 40 2.2.6 字符串插入 42 2.2.7 字符串格式化 43 2.2.8 处理HTML和XML文本 43 2.3 字符串匹配 44 2.3.1 字符串开头或结尾匹配 44 2.3.2 用Shell通配符匹配字符串 46 2.3.3 字符串匹配和搜索 47 2.3.4 最短匹配 49 2.3.5 多行匹配 50 2.4 字符串搜索 50 2.4.1 字符串搜索替换 50 2.4.2 字符串忽略大小写的搜索替换 51 2.5 将Unicode文本标准化 52 2.6 在正则表达式中使用Unicode字符 54 2.7 令牌解析 55 2.8 简单的递归下降分析器实现 57 2.9 字节字符串操作 64 2.10 本章小结 66 第3章 数据结构 67 3.1 序列 67 3.1.1 序列对象解析 67 3.1.2 序列解压 68 3.1.3 序列去重并保持顺序 70 3.1.4 序列元素统计 71 3.1.5 过滤序列元素 72 3.1.6 序列元素名称映射 74 3.1.7 转换并计算数据 76 3.2 字典 77 3.2.1 字典对象解析 77 3.2.2 字典映射 79 3.2.3 字典排序 81 3.2.4 字典运算 81 3.2.5 字典查找 83 3.2.6 通过关键字排序字典 84 3.2.7 字典提取 85 3.2.8 字典合并 86 3.3 可迭代对象操作 88 3.3.1 可迭代对象解压 88 3.3.2 保留最后N个元素 89 3.3.3 记录分组 90 3.4 查找最大或最小的N个元素 91 3.5 实现一个优先级队列 92 3.6 命名切片 95 3.7 排序不支持原生比较的对象 96 3.8 本章小结 97 第4章 迭代器与生成器 98 4.1 迭代操作 98 4.1.1 手动遍历迭代器 98 4.1.2 代理迭代 99 4.1.3 实现迭代协议 100 4.1.4 反向迭代 102 4.1.5 迭代器切片 104 4.1.6 跳过可迭代对象的开始部分 104 4.1.7 排列组合的迭代 106 4.1.8 序列上索引值迭代 107 4.1.9 多个序列迭代 109 4.1.10 集合元素的迭代 111 4.1.11 顺序迭代合并后的排序迭代对象 112 4.1.12 迭代器代替while无限循环 113 4.2 使用生成器创建新的迭代模式 113 4.3 带有外部状态的生成器函数 115 4.4 创建数据处理管道 116 4.5 展开嵌套的序列 118 4.6 本章小结 120 第5章 文件与I/O 121 5.1 读/写操作 121 5.1.1 读/写文本数据 121 5.1.2 读/写字节数据 123 5.1.3 读/写压缩文件 124 5.2 文件操作 126 5.2.1 文件的写入 126 5.2.2 操作文件路径名 126 5.2.3 文件检查 127 5.2.4 文件列表获取 128 5.2.5 忽略文件名编码 129 5.2.6 打印不合法的文件名 130 5.2.7 文件编码变更 132 5.2.8 在文本文件中写入字节 133 5.2.9 文件描述符包装 134 5.2.10 创建临时文件和文件夹 135 5.2.11 文件迭代 137 5.2.12 二进制文件映射 137 5.3 使用分隔符或行终止符打印 139 5.4 字符串的I/O操作 140 5.5 可变缓冲区中二进制数据的读取 141 5.6 串行端口的数据通信 143 5.7 对象序列化 143 5.8 本章小结 146 第6章 数据编码及处理 147 6.1 数据读/写 147 6.1.1 CSV数据读/写 147 6.1.2 JSON数据读/写 151 6.1.3 二进制数组数据读/写 155 6.1.4 嵌套和可变长二进制数据读取 158 6.2 XML数据解析 166 6.2.1 简单XML数据解析 166 6.2.2 解析XML文档 167 6.2.3 修改XML 169 6.3 字典转换为XML 170 6.4 与关系型数据库的交互 172 6.5 编码/解码 174 6.5.1 十六进制数编码和解码 174 6.5.2 编码/解码Base64数据 175 6.6 本章小结 176 第7章 函数 177 7.1 函数定义 177 7.1.1 有默认参数的函数定义 177 7.1.2 匿名或内联函数定义 180 7.2 函数的参数 181 7.2.1 接收任意数量参数 181 7.2.2 接收关键字参数 183 7.2.3 为参数增加元信息 184 7.2.4 减少参数个数 185 7.3 返回多个值的函数 187 7.4 变量处理 188 7.4.1 匿名函数捕获变量值 188 7.4.2 访问闭包中定义的变量 190 7.5 类转换为函数 192 7.6 回调函数 193 7.6.1 有额外状态信息的回调函数 193 7.6.2 内联回调函数 196 7.7 本章小结 198 第8章 类与对象 199 8.1 对象处理 199 8.1.1 对象显示 199 8.1.2 有效创建大量对象 200 8.1.3 由字符串调用对象 201 8.2 自定义格式化字符串 202 8.3 上下文管理协议 203 8.4 类的处理 205 8.4.1 封装属性名 205 8.4.2 调用父类方法 207 8.4.3 扩展property 213 8.4.4 创建新的类或实例属性 217 8.4.5 定义多个构造器 219 8.4.6 类中的比较操作 220 8.5 属性处理 222 8.5.1 可管理属性创建 222 8.5.2 延迟计算属性 226 8.5.3 属性的代理访问 229 8.6 数据结构的初始化 233 8.7 接口或者抽象基类定义 236 8.8 数据模型的类型约束 238 8.9 自定义容器 243 8.10 不调用init方法的实例创建 246 8.11 利用Mixin扩展类功能 247 8.12 状态对象实现 249 8.13 设计模式处理 252 8.13.1 访问者模式 252 8.13.2 不用递归实现访问者模式 255 8.14 数据结构的内存管理 259 8.15 创建缓存 262 8.16 本章小结 266 第9章 元编程 267 9.1 装饰器 267 9.1.1 函数添加装饰器 267 9.1.2 装饰器中保留函数元信息 269 9.1.3 解除装饰器 271 9.1.4 带参数的装饰器 272 9.1.5 装饰器自定义属性 273 9.1.6 带可选参数的装饰器 276 9.1.7 函数的类型检查 278 9.1.8 类中定义装饰器 281 9.1.9 装饰器定义为类 282 9.1.10 类和静态方法的装饰器 285 9.1.11 给函数增加参数 287 9.1.12 扩充类的功能 289 9.2 元类 291 9.2.1 控制实例创建 291 9.2.2 元类定义可选参数 293 9.3 类的属性定义顺序 295 9.4 强制参数签名 297 9.5 强制使用编程规约 300 9.6 以编程方式定义类 303 9.7 初始化类的成员 306 9.8 利用注解实现方法重载 307 9.9 避免重复的属性方法 313 9.10 定义上下文管理器 314 9.11 局部变量域中执行代码 316 9.12 Python源码解析 319 9.13 Python字节码拆解 322 9.14 本章小结 324 第10章 模块与包 325 10.1 模块处理 325 10.1.1 模块层级 325 10.1.2 控制模块的导入 326 10.1.3 重新加载模块 327 10.1.4 通过字符串名导入模块 328 10.1.5 远程加载模块 329 10.1.6 导入模块的同时修改模块 346 10.2 读取包中的数据文件 348 10.3 将文件夹加入sys.path 349 10.4 安装私有的包 350 10.5 创建新的Python环境 350 10.6 分发包 352 10.7 本章小结 353 第11章 网络编程 354 11.1 与HTTP服务交互 354 11.2 创建服务器 357 11.2.1 TCP服务器 357 11.2.2 UDP服务器 360 11.3 通过CIDR地址生成对应的IP地址集 361 11.4 REST接口创建 363 11.5 远程调用 367 11.5.1 远程方法调用 367 11.5.2 通过XML-RPC远程调用 371 11.6 不同Python解释器之间的交互 373 11.7 客户端认证 374 11.8 Socket文件描述符传递 376 11.9 事件驱动的I/O 380 11.10 大型数组发送与接收 385 11.11 本章小结 387 第12章 并发编程 388 12.1 线程处理 388 12.1.1 线程的启动与停止 388 12.1.2 线程判断 391 12.1.3 线程间通信 394 12.1.4 线程加锁 398 12.1.5 防止死锁 401 12.1.6 线程状态信息保存 404 12.1.7 创建线程池 405 12.2 并行编程 408 12.3 全局锁问题 412 12.4 Actor任务定义 414 12.5 消息发布/订阅模型 417 12.6 生成器代替线程 420 12.7 线程队列轮询 427 12.8 守护进程 429 12.9 本章小结 432 第13章 脚本编程与系统管理 433 13.1 脚本接收 433 13.2 终止程序 434 13.3 解析命令行选项 434 13.4 弹出密码输入提示 436 13.5 执行外部命令 437 13.6 文件操作 439 13.6.1 文件和的复制或移动 439 13.6.2 创建和解压归档文件 440 13.6.3 文件查找 441 13.6.4 配置文件读取 442 13.7 添加日志 444 13.7.1 脚本增加日志功能 444 13.7.2 函数库增加日志功能 446 13.8 实现计时器 447 13.9 内存和CPU监测 449 13.10 启动Web浏览器 450 13.11 本章小结 451 第14章 测试、调试和异常 452 14.1 测试 452 14.1.1 stdout输出 452 14.1.2 对象打补丁 453 14.1.3 测试异常 455 14.1.4 记录测试结果 457 14.1.5 性能测试 458 14.1.6 测试失败处理 460 14.2 异常处理 461 14.2.1 捕获所有异常 461 14.2.2 处理多个异常 462 14.2.3 自定义异常 464 14.2.4 抛出新的异常 466 14.2.5 异常重新抛出 468 14.2.6 警告信息 468 14.3 程序调试 470 14.4 加速程序运行 472 14.5 实战—自然语言处理 476 14.6 本章小结 502 第15章 Python的内存管理机制 503 15.1 Python内存架构 503 15.2 小块空间的内存池 505 15.2.1 block 505 15.2.2 pool 506 15.2.3 arena 506 15.2.4 内存池 507 15.3 循环引用的垃圾收集 509 15.3.1 引用计数与垃圾收集 509 15.3.2 三色标记模型 510 15.4 Python垃圾收集 511 15.4.1 可收集对象链表 511 15.4.2 分代垃圾收集 513 15.4.3 Python中的标记—清除方法 514 15.5 实战——内存监控 516 15.6 本章小结 520 第16章 性能优化与实践 521 16.1 优化的规则 521 16.1.1 先使程序可以正常工作 521 16.1.2 从用户的角度进行 522 16.1.3 保证代码易读 522 16.2 优化策略 523 16.2.1 寻找其他原因 523 16.2.2 度量硬件 523 16.2.3 编写速度测试代码 523 16.3 查找瓶颈 524 16.3.1 剖析CPU使用情况 524 16.3.2 剖析内存使用情况 528 16.4 降低复杂度 530 16.4.1 测量回路复杂度 530 16.4.2 测量大O记号 530 16.4.3 简化 531 16.5 实战——爬虫程序的性能优化 532 16.6 本章小结 537 ---------------------------8078189 - 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 |