Code samples from the "Python Cookbook, 3rd Edition", published by O'Reilly & Associates, May, 2013.
目录
- 1 将序列分解为单独的变量 1
- 2 从任意长度的可迭代对象中分解元素 3
- 3 保存最后N个元素 5
- 4 找到最大或最小的N个元素 7
- 5 实现优先级队列 9
- 6 在字典中将键映射到多个值上 11
- 7 让字典保持有序 13
- 8 与字典有关的计算问题 14
- 9 在两个字典中寻找相同点 15
- 10 从序列中移除重复项且保持元素间顺序不变 17
- 11 对切片命名 18
- 12 找出序列中出现次数最多的元素 20
- 13 通过公共键对字典列表排序 22
- 14 对不原生支持比较操作的对象排序 23
- 15 根据字段将记录分组 25
- 16 筛选序列中的元素 26
- 17 从字典中提取子集 29
- 18 将名称映射到序列的元素中 30
- 19 同时对数据做转换和换算 33
- 20 将多个映射合并为单个映射 34
- 1 针对任意多的分隔符拆分字符串 37
- 2 在字符串的开头或结尾处做文本匹配 38
- 3 利用Shell通配符做字符串匹配 40
- 4 文本模式的匹配和查找 42
- 5 查找和替换文本 45
- 6 以不区分大小写的方式对文本做查找和替换 47
- 7 定义实现最短匹配的正则表达式 48
- 8 编写多行模式的正则表达式 49
- 9 将Unicode文本统一表示为规范形式 50
- 10 用正则表达式处理Unicode字符 52
- 11 从字符串中去掉不需要的字符 53
- 12 文本过滤和清理 54
- 13 对齐文本字符串 57
- 14 字符串连接及合并 59
- 15 给字符串中的变量名做插值处理 62
- 16 以固定的列数重新格式化文本 64
- 17 在文本中处理HTML和XML实体 66
- 18 文本分词 67
- 19 编写一个简单的递归下降解析器 70
- 20 在字节串上执行文本操作 80
- 1 对数值进行取整 83
- 2 执行精确的小数计算 85
- 3 对数值做格式化输出 87
- 4 同二进制、八进制和十六进制数打交道 89
- 5 从字节串中打包和解包大整数 90
- 6 复数运算 92
- 7 处理无穷大和NaN 94
- 8 分数的计算 96
- 9 处理大型数组的计算 97
- 10 矩阵和线性代数的计算 101
- 11 随机选择 103
- 12 时间换算 105
- 13 计算上周5的日期 107
- 14 找出当月的日期范围 108
- 15 将字符串转换为日期 110
- 16 处理涉及到时区的日期问题 112
- 1 手动访问迭代器中的元素 114
- 2 委托迭代 115
- 3 用生成器创建新的迭代模式 116
- 4 实现迭代协议 118
- 5 反向迭代 121
- 6 定义带有额外状态的生成器函数 122
- 7 对迭代器做切片操作 123
- 8 跳过可迭代对象中的前一部分元素 124
- 9 迭代所有可能的组合或排列 127
- 10 以索引-值对的形式迭代序列 129
- 11 同时迭代多个序列 131
- 12 在不同的容器中进行迭代 133
- 13 创建处理数据的管道 134
- 14 扁平化处理嵌套型的序列 137
- 15 合并多个有序序列,再对整个有序序列进行迭代 139
- 16 用迭代器取代while循环 140
- 1 读写文本数据 142
- 2 将输出重定向到文件中 145
- 3 以不同的分隔符或行结尾符完成打印 145
- 4 读写二进制数据 146
- 5 对已不存在的文件执行写入操作 149
- 6 在字符串上执行I/O操作 150
- 7 读写压缩的数据文件 151
- 8 对固定大小的记录进行迭代 152
- 9 将二进制数据读取到可变缓冲区中 153
- 10 对二进制文件做内存映射 155
- 11 处理路径名 157
- 12 检测文件是否存在 158
- 13 获取目录内容的列表 159
- 14 绕过文件名编码 161
- 15 打印无法解码的文件名 162
- 16 为已经打开的文件添加或修改编码方式 164
- 17 将字节数据写入文本文件 166
- 18 将已有的文件描述符包装为文件对象 167
- 19 创建临时文件和目录 169
- 20 同串口进行通信 171
- 21 序列化Python对象 172
- 1 读写CSV数据 177
- 2 读写JSON数据 181
- 3 解析简单的XML文档 186
- 4 以增量方式解析大型XML文件 188
- 5 将字典转换为XML 192
- 6 解析、修改和重写XML 194
- 7 用命名空间来解析XML文档 196
- 8 同关系型数据库进行交互 198
- 9 编码和解码十六进制数字 201
- 10 Base64编码和解码 202
- 11 读写二进制结构的数组 203
- 12 读取嵌套型和大小可变的二进制结构 207
- 13 数据汇总和统计 218
- 1 编写可接受任意数量参数的函数 221
- 2 编写只接受关键字参数的函数 223
- 3 将元数据信息附加到函数参数上 224
- 4 从函数中返回多个值 225
- 5 定义带有默认参数的函数 226
- 6 定义匿名或内联函数 229
- 7 在匿名函数中绑定变量的值 230
- 8 让带有N个参数的可调用对象以较少的参数形式调用 232
- 9 用函数替代只有单个方法的类 235
- 10 在回调函数中携带额外的状态 236
- 11 内联回调函数 240
- 12 访问定义在闭包内的变量 242
- 1 修改实例的字符串表示 246
- 2 自定义字符串的输出格式 248
- 3 让对象支持上下文管理协议 249
- 4 当创建大量实例时如何节省内存 251
- 5 将名称封装到类中 252
- 6 创建可管理的属性 254
- 7 调用父类中的方法 259
- 8 在子类中扩展属性 263
- 9 创建一种新形式的类属性或实例属性 267
- 10 让属性具有惰性求值的能力 271
- 11 简化数据结构的初始化过程 274
- 12 定义一个接口或抽象基类 278
- 13 实现一种数据模型或类型系统 281
- 14 实现自定义的容器 287
- 15 委托属性的访问 291
- 16 在类中定义多个构造函数 296
- 17 不通过调用init来创建实例 298
- 18 用Mixin技术来扩展类定义 299
- 19 实现带有状态的对象或状态机 305
- 20 调用对象上的方法,方法名以字符串形式给出 311
- 21 实现访问者模式 312
- 22 实现非递归的访问者模式 317
- 23 在环状数据结构中管理内存 324
- 24 让类支持比较操作 327
- 25 创建缓存实例 330
- 1 给函数添加一个包装 335
- 2 编写装饰器时如何保存函数的元数据 337
- 3 对装饰器进行解包装 339
- 4 定义一个可接受参数的装饰器 341
- 5 定义一个属性可由用户修改的装饰器 342
- 6 定义一个能接收可选参数的装饰器 346
- 7 利用装饰器对函数参数强制执行类型检查 348
- 8 在类中定义装饰器 352
- 9 把装饰器定义成类 354
- 10 把装饰器作用到类和静态方法上 357
- 11 编写装饰器为被包装的函数添加参数 359
- 12 利用装饰器给类定义打补丁 362
- 13 利用元类来控制实例的创建 364
- 14 获取类属性的定义顺序 367
- 15 定义一个能接受可选参数的元类 370
- 16 在*args和**kwargs上强制规定一种参数签名 372
- 17 在类中强制规定编码约定 375
- 18 通过编程的方式来定义类 378
- 19 在定义的时候初始化类成员 382
- 20 通过函数注解来实现方法重载 384
- 21 避免出现重复的属性方法 391
- 22 以简单的方式定义上下文管理器 393
- 23 执行带有局部副作用的代码 395
- 24 解析并分析Python源代码 398
- 25 将Python源码分解为字节码 402
- 1 把模块按层次结构组织成包 406
- 2 对所有符号的导入进行精确控制 407
- 3 用相对名称来导入包中的子模块 408
- 4 将模块分解成多个文件 410
- 5 让各个目录下的代码在统一的命名空间下导入 413
- 6 重新加载模块 415
- 7 让目录或zip文件成为可运行的脚本 416
- 8 读取包中的数据文件 417
- 9 添加目录到sys. path中 418
- 10 使用字符串中给定的名称来导入模块 420
- 11 利用import钩子从远端机器上加载模块 421
- 12 在模块加载时为其打补丁 439
- 13 安装只为自己所用的包 441
- 14 创建新的Python环境 442
- 15 发布自定义的包 444
- 1 以客户端的形式同HTTP服务交互 446
- 2 创建一个TCP服务器 450
- 3 创建一个UDP服务器 454
- 4 从CIDR地址中生成IP地址的范围 456
- 5 创建基于REST风格的简单接口 458
- 6 利用XML-RPC实现简单的远端过程调用 463
- 7 在不同的解释器间进行通信 466
- 8 实现远端过程调用 468
- 9 以简单的方式验证客户端身份 472
- 10 为网络服务增加SSL支持 474
- 11 在进程间传递socket文件描述符 481
- 12 理解事件驱动型I/O 486
- 13 发送和接收大型数组 493
- 1 启动和停止线程 496
- 2 判断线程是否已经启动 499
- 3 线程间通信 503
- 4 对临界区加锁 508
- 5 避免死锁 511
- 6 保存线程专有状态 515
- 7 创建线程池 517
- 8 实现简单的并行编程 521
- 9 如何规避GIL带来的限制 525
- 10 定义一个Actor任务 528
- 11 实现发布者/订阅者消息模式 532
- 12 使用生成器作为线程的替代方案 536
- 13 轮询多个线程队列 544
- 14 在UNIX上加载守护进程 547
- 1 通过重定向、管道或输入文件来作为脚本的输入 552
- 2 终止程序并显示错误信息 553
- 3 解析命令行选项 554
- 4 在运行时提供密码输入提示 557
- 5 获取终端大小 558
- 6 执行外部命令并获取输出 558
- 7 拷贝或移动文件和目录 560
- 8 创建和解包归档文件 562
- 9 通过名称来查找文件 563
- 10 读取配置文件 565
- 11 给脚本添加日志记录 568
- 12 给库添加日志记录 571
- 13 创建一个秒表计时器 573
- 14 给内存和CPU使用量设定限制 575
- 15 加载Web浏览器 576
- 1 测试发送到stdout上的输出 578
- 2 在单元测试中为对象打补丁 579
- 3 在单元测试中检测异常情况 583
- 4 将测试结果作为日志记录到文件中 585
- 5 跳过测试,或者预计测试结果为失败 586
- 6 处理多个异常 587
- 7 捕获所有的异常 589
- 8 创建自定义的异常 591
- 9 通过引发异常来响应另一个异常 593
- 10 重新抛出上一个异常 595
- 11 发出告警信息 596
- 12 对基本的程序崩溃问题进行调试 598
- 13 对程序做性能分析以及计时统计 600
- 14 让你的程序运行得更快 603
- 1 利用ctypes来访问C代码 612
- 2 编写简单的C语言扩展模块 618
- 3 编写一个可操作数组的扩展函数 622
- 4 在C扩展模块中管理不透明指针 625
- 5 在扩展模块中定义并导出C API 628
- 6 从C中调用Python 633
- 7 在C扩展模块中释放GIL 639
- 8 混合使用C和Python环境中的线程 639
- 9 用Swig来包装C代码 640
- 10 用Cython来包装C代码 646
- 11 用Cython来高效操作数组 652
- 12 把函数指针转换为可调用对象 657
- 13 把以NULL结尾的字符串传给C库 659
- 14 把Unicode字符串传递给C库 663
- 15 把C字符串转换到Python中 667
- 16 同编码方式不确定的C字符串打交道 669
- 17 把文件名传给C扩展模块 672
- 18 把打开的文件传给C扩展模块 673
- 19 在C中读取文件型对象 674
- 20 从C中访问可迭代对象 677
- 21 排查段错误 678 附录A 补充阅读 680