书库技术与未来流畅的 Python(第2版)
书籍封面

流畅的 Python(第2版)

作者 卢西亚诺 • 拉马略(Luciano Ramalho)
18.0 分钟

摘要

好的,我已经了解了您的要求。现在开始对您提供的内容进行总结和提炼:

流畅的 Python(第2版)版权声明及前言

  • 这本书着重讲解Python语言所独有的功能,而非面面俱到。
  • 你能获得:精通 Python 3 独有的语言特性和设计模式,编写更具表达力、更符合 Python 风格的代码。

核心内容:

1. Python 数据模型

  • Python 数据模型可以理解为框架,其是对框架的描述,规范了Python语言自身各个组成部分的接口,确立了序列、函数、迭代器、协程、类、上下文管理器等部分的行为。
  • 详细解释:通过实现特殊方法(前后两端都有双下划线),可以让对象支持基本的语言结构并与其交互。
  • 你无法直接调用特殊方法,但是,如果需要调用特殊方法,则最好调用相应的内置函数,例如 len、iter、str 等。这些内置函数不仅调用对应的特殊方法,通常还提供额外服务,而且对于内置类型来说,速度比调用方法更快。

2. 对象表示形式

  • 掌握如何通过特殊方法(例如 reprstrformatbytes)来控制对象的字符串和字节序列表示形式。
  • 详细解释:
    • __repr__:供内置函数 repr 调用,获取对象的字符串表示形式,方便重新创建所表示的对象。
    • __str__:由内置函数 str() 调用,返回对终端用户友好的字符串。
    • __format__:供 f 字符串、内置函数 format() 和 str.format() 方法使用,通过调用 obj.format(format_spec) 以特殊的格式化代码显示对象的字符串表示形式。
    • __bytes__:返回对象的字节序列表示形式。

3. 数值类型模拟

  • 学习如何使用特殊方法,使自定义的对象能够像内置的数值类型一样响应算术运算。
  • 详细解释:通过重载 addmul 等方法,可以让用户对象响应 + 等运算符。
  • 举例: 实现一个二维向量类,通过实现 addmul 方法,可以实现向量的加法和标量积。

4. 自定义类型的布尔值

  • 了解Python如何确定一个对象的真值或假值,并学会如何通过实现 bool 方法自定义类型的布尔行为。
  • 详细解释:默认情况下,用户定义类的实例都是真值,除非实现了 boollen 方法。bool(x) 调用 x.bool(),以后者返回的结果为准。如果没有实现 bool 方法,则 Python 尝试调用 x.len();如果该方法返回零值,则 bool 函数返回 False,否则返回 True。

5. 容器 API

  • 掌握Python中基本容器类型(如序列、映射和集合)的接口,并学会如何使用特殊方法实现自定义容器。
  • 详细解释:
    • Iterable: 要支持 for、拆包和其他迭代方式
    • Sized: 要支持内置函数 len
    • Container: 要支持 in 运算符

6. 函数即对象

  • 了解 Python 中函数是一等对象的概念,以及这意味着什么。
  • 详细解释:Python 函数是一等对象,可以在运行时创建,能赋值给变量,作为参数传递,并能作为函数的返回结果。
  • 理解高阶函数(接受函数为参数或者把函数作为结果返回的函数),比如 map、filter 和 reduce。
  • 熟悉匿名函数(lambda 表达式),以及何时使用它们。
  • 掌握 9 种可调用对象,知道Python中判断对象能否调用的安全方法是使用内置函数 callable()。

7. 用户定义的可调用类型

  • 学习如何通过实现 call 方法,使类的实例能够像函数一样被调用。
  • 详细解释:实现 call 方法是创建类似函数的对象的简便方式,此时必须在内部维护一个状态,让它在多次调用之间存续。

8. 从位置参数到仅限关键字参数

  • 掌握 Python 函数灵活的参数处理机制,包括位置参数、关键字参数和仅限关键字参数。
  • 详细解释:在函数签名中使用 * 来支持仅限关键字参数,使用 / 来指定仅限位置参数。

9. 支持函数式编程的包

  • 了解 operator 模块提供的算术运算符函数,以及 itemgetter 和 attrgetter 工厂函数,用于替代 lambda 表达式。
  • 掌握 functools 模块中的 partial 函数,用于冻结某些参数,实现部分应用程序。

10. 使用一等函数实现设计模式

  • 学习如何利用函数作为对象,简化常见的设计模式,比如策略模式和命令模式。
  • 详细解释:通过把具体策略换成简单的函数,可以减少代码行数和运行时的消耗。

11. 特殊方法概述

  • 理解特殊方法(例如 reprlengetitem)在 Python 数据模型中的作用,以及如何通过实现这些方法,让自定义对象的行为与内置类型保持一致。
  • 了解 Python 数据模型定义的特殊方法,包括新增的异步特殊方法,以及为类定义钩子的特殊方法。

问答

Q: 什么是特殊方法?

A: 特殊方法是以双下划线开头和结尾的方法,供 Python 解释器调用,用于执行基本对象操作,通常由特殊句法触发。

Q: 什么是 duck typing(鸭子类型)?

A: 鸭子类型是一种编程风格,不检查对象的类型,而是关注对象是否实现了特定的协议(即是否提供了所需的方法)。

Q: 什么是高阶函数?

A: 接受函数为参数或者把函数作为结果返回的函数是高阶函数。

Q: 什么是描述符?

A: 描述符是实现了 get 方法、set 方法或 delete 方法的类。描述符的用法是,创建一个实例,作为另一个类的类属性。

思维导图

目标读者

本书的目标读者是那些正在使用 Python,同时想熟练掌握 Python 3 的程序员。建议读者在阅读本书之前,先回顾 Python 官方教程,对 Python 的基本概念和语法有一定的了解。

作者背景

卢西亚诺 • 拉马略是一位经验丰富的 Python 程序员,拥有超过 20 年的从业经验。他从 1998 年开始使用和教授 Python,并一直积极参与 Python 社区的讨论和发展。他热衷于学习和比较不同的编程语言,研究语言的设计和背后的理论。他也是巴西第一个众创空间 Garoa Hacker Clube 的联合创始人。

历史背景

Python 作为一门易于上手又功能强大的编程语言,吸引了众多程序员。然而,许多 Python 程序员只用到了其强大功能的一小部分。本书正是在这样的背景下创作,旨在帮助 Python 程序员突破自身局限,掌握 Python 语言核心以及它的一些库,写出更具表现力的代码,符合社区所认可的 Python 风格。

章节摘要

音频

Comming Soon...