From 5aecddda6ba702f61ba214a759b31864b046e19a Mon Sep 17 00:00:00 2001 From: wuyudi Date: Mon, 17 Aug 2020 02:15:01 +0800 Subject: [PATCH 1/6] Update 2.3.md --- 2.3.md | 81 +++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 52 insertions(+), 29 deletions(-) diff --git a/2.3.md b/2.3.md index bb7c895..b195cf9 100644 --- a/2.3.md +++ b/2.3.md @@ -39,7 +39,7 @@ ![](img/nested_pairs.png) -使用元组作为其它元组元素的能力,提供了我们编程语言中的一个新的组合手段。我们将这种将元组以这种方式嵌套的能力叫做元组数据类型的封闭性。通常,如果组合结果自己可以使用相同的方式组合,组合数据值的方式就满足封闭性。封闭性在任何组合手段中都是核心能力,因为它允许我们创建层次数据结构 -- 结构由多个部分组成,它们自己也由多个部分组成,以此类推。我们在第三章会探索一些层次结构。现在,我们考虑一个特定的重要结构。 +我们使用元组作为其他元组的元素的能力,在我们的编程语言中提供了一种新的组合手段。我们将这种将元组以这种方式嵌套的能力叫做元组数据类型的闭包属性。通常,如果组合结果自己可以使用相同的方式组合,组合数据值的方式就满足闭包属性。闭包属性在任何组合手段中都是核心能力,因为它允许我们创建层次数据结构 -- 结构由多个部分组成,它们自己也由多个部分组成,以此类推。我们在第三章会探索一些层次结构。现在,我们考虑一个特定的重要结构。 ## 2.3.2 递归列表 @@ -90,6 +90,8 @@ (2, (3, (4, None))) ``` +回想一下,我们能够使用函数来表示序对,因此我们也可以使用函数来表示递归列表。 + 递归列表可以按序储存元素序列,但是它还没有实现序列的抽象。使用我们已经定义的数据类型抽象,我们就可以实现描述两个序列的行为:长度和元素选择。 ```py @@ -117,7 +119,7 @@ 两个实现都是可迭代的。它们隔离了嵌套偶对的每个层级,直到列表的末尾(在`len_rlist`中),或者到达了想要的元素(在`getitem_rlist`中)。 -下面的一系列环境图示展示了迭代过程,`getitem_rlist`通过它找到了递归列表中下标`1`中的元素`2`。 +下面的一系列环境图示展示了迭代过程,`getitem_rlist`通过它找到了递归列表中下标`1`中的元素`2`。首先,调用函数 `getitem_rlist`,创建一个局部框架。 ![](img/getitem_rlist_0.png) @@ -131,7 +133,7 @@ 最后的环境图示展示了调用`first`的局部帧,它包含绑定到相同子列表的`s`。`first`函数挑选出值`2`并返回了它,完成了`getitem_rlist`的调用。 -这个例子演示了递归列表计算的常见模式,其中迭代的每一步都操作原列表的一个逐渐变短的后缀。寻找递归列表的长度和元素的渐进式处理过程需要一些时间来计算。(第三章中,我们会学会描述这种函数的计算时间。)Python 的内建序列类型以不同方式实现,它对于计算序列长度和获取元素并不具有大量的计算开销。 +这个例子展示了一种常见的递归列表计算模式,即迭代中的每一步都对原始列表越来越短的后缀进行操作。这种寻找递归列表的长度和元素的增量处理确实需要一些时间来计算。(在第三章中,我们将学习如何描述像这样的迭代函数的计算时间。)Python 的内建序列类型以不同方式实现,它对于计算序列长度和获取元素并不具有大量的计算开销。 ## 2.3.2 元组 II @@ -154,7 +156,7 @@ (2, 7, 1, 8, 2, 8, 1, 8, 2, 8) ``` -**映射。**将一个元组变换为另一个元组的强大手段是在每个元素上调用函数,并收集结果。这一计算的常用形式叫做在序列上映射函数,对应内建函数`map`。`map`的结果是一个本身不是序列的对象,但是可以通过调用`tuple`来转换为序列。它是元组的构造器。 +**映射。**将一个元组变换为另一个元组的强大手段是在每个元素上调用函数,并收集结果。这一计算的常用形式叫做在序列上映射函数,对应内建函数`map`。`map`的结果对象不是序列,但可以通过调用tuples的构造函数`tuple`转换为序列。 ```py >>> alternates = (-1, 2, -3, 4, -5) @@ -168,7 +170,7 @@ 映射本身就是通用计算模式的一个实例:在序列中迭代所有元素。为了在序列上映射函数,我们不仅仅需要选择特定的元素,还要依次选择每个元素。这个模式非常普遍,Python 拥有额外的控制语句来处理序列数据:`for`语句。 -考虑一个问题,计算一个值在序列中出现了多少次。我们可以使用`while`循环实现一个函数来计算这个数量。 +考虑某个值在序列中出现多少次的计数问题。我们可以使用`while`循环实现一个函数来计算这个数量。 ```py >>> def count(s, value): @@ -183,7 +185,7 @@ 2 ``` -Python `for`语句可以通过直接迭代元素值来简化这个函数体,完全不需要引入`index`。例如(原文是`For example`,为双关语),我们可以写成: +Python `for`语句可以通过直接迭代元素值来简化这个函数体,完全不需要引入`index`。例如(原文是`For example`,为双关语)举个 `For` 的例子,我们可以写成: ```py >>> def count(s, value): @@ -197,6 +199,13 @@ Python `for`语句可以通过直接迭代元素值来简化这个函数体, 2 ``` +`for` 语句由一个单一子句组成,其形式如下: + +```py +for in : + +``` + `for`语句按照以下过程来执行: 1. 求出头部表达式``,它必须产生一个可迭代的值。 @@ -214,7 +223,13 @@ Python `for`语句可以通过直接迭代元素值来简化这个函数体, >>> pairs = ((1, 2), (2, 2), (2, 3), (4, 4)) ``` -下面的`for`语句的头部带有两个名词,会将每个名称`x`和`y`分别绑定到每个偶对的第一个和第二个元素上。 +并希望找出有几对的第一和第二元素相同。 + +```py +>>> same_count = 0 +``` + +下面的`for`语句的头部带有两个名称,会将每个名称`x`和`y`分别绑定到每个偶对的第一个和第二个元素上。 ```py >>> for x, y in pairs: @@ -224,6 +239,8 @@ Python `for`语句可以通过直接迭代元素值来简化这个函数体, 2 ``` +> 译者注:可以写 `same_count = sum(1 for x,y in pairs if x==y)` , 或 `same_count = sum(1 if x==y else 0 for x,y in pairs)` + 这个绑定多个名称到定长序列中多个值的模式,叫做序列解构。它的模式和我们在赋值语句中看到的,将多个名称绑定到多个值的模式相同。 **范围。**`range`是另一种 Python 的内建序列类型,它表示一个整数范围。范围可以使用`range`函数来创建,它接受两个整数参数:所得范围的第一个数值和最后一个数值加一。 @@ -233,7 +250,7 @@ Python `for`语句可以通过直接迭代元素值来简化这个函数体, range(1, 10) ``` -在范围上调用`tuple`构造器会创建与范围具有相同元素的元组,使元素易于查看。 +在范围上调用`tuple`构造器会创建与范围具有相同元素的元组,这样就可以方便地检查元素。 ```py >>> tuple(range(5, 8)) @@ -242,6 +259,13 @@ range(1, 10) 如果只提供了一个元素,它会解释为最后一个数值加一,范围开始于 0。 +```py +>>> tuple(range(4)) +(0, 1, 2, 3) +``` + +范围通常以表达式的形式出现在`for`头部,用于指定该语句组的执行次数。 + ```py >>> total = 0 >>> for k in range(5, 8): @@ -250,7 +274,7 @@ range(1, 10) 18 ``` -常见的惯例是将单下划线字符用于`for`头部,如果这个名称在语句组中不会使用。 +一个常见的惯例是,如果名称在语句组中未被使用,则在`for`头部中为名称使用一个下划线字符。 ```py >>> for _ in range(3): @@ -267,7 +291,7 @@ Go Bears! 我们已经介绍了两种原生数据类型,它们实现了序列抽象:元组和范围。两个都满足这一章开始时的条件:长度和元素选择。Python 还包含了两种序列类型的行为,它们扩展了序列抽象。 -**成员性。**可以测试一个值在序列中的成员性。Python 拥有两个操作符`in`和`not in`,取决于元素是否在序列中出现而求值为`True`和`False`。 +**成员性。**可以测试一个值在序列中的成员性。Python 有两个运算符 in 和 not in,根据一个元素是否出现在序列中,它们的值为 True 或 False。 ```py >>> digits @@ -291,17 +315,17 @@ Python 中,序列切片的表示类似于元素选择,使用方括号。冒 (8, 2, 8) ``` -Python 序列抽象的这些额外行为的枚举,给我们了一个机会来反思数据抽象通常由什么构成。抽象的丰富性(也就是说它包含行为的多少)非常重要。对于使用抽象的用户,额外的行为很有帮助,另一方面,满足新类型抽象的丰富需求是个挑战。为了确保我们的递归列表实现支持这些额外的行为,需要一些工作量。另一个抽象丰富性的负面结果是,它们需要用户长时间学习。 +列举Python序列抽象的这些附加行为,让我们有机会反思什么是一般有用的数据抽象。一个抽象的丰富性(也就是说它包含多少行为)是有影响的。对于使用抽象的用户,额外的行为很有帮助,另一方面,用一个新的数据类型来满足一个丰富的抽象的要求可能是具有挑战性的。为了确保我们的递归列表实现支持这些额外的行为,需要一些工作量。丰富抽象的另一个负面后果是,它们需要用户长时间学习。 序列拥有丰富的抽象,因为它们在计算中无处不在,所以学习一些复杂的行为是合理的。通常,多数用户定义的抽象应该尽可能简单。 -**扩展阅读。**切片符号接受很多特殊情况,例如负的起始值,结束值和步长。Dive Into Python 3 中有一节叫做[列表切片](http://diveintopython3.ep.io/native-datatypes.html#slicinglists),完整描述了它。这一章中,我们只会用到上面描述的基本特性。 +**扩展阅读。**切片符号接受很多特殊情况,例如负的起始值,结束值和步长。Dive Into Python 3 中有一节叫做[列表切片](http://diveintopython3.problemsolving.io/native-datatypes.html#slicinglists),完整描述了它。这一章中,我们只会用到上面描述的基本特性。 ## 2.3.6 字符串 -文本值可能比数值对计算机科学来说更基本。作为一个例子,Python 程序以文本编写和储存。Python 中原生的文本数据类型叫做字符串,相应的构造器是`str`。 +对计算机科学来说,文本值甚至可能比数值更基本。举个例子,Python 程序以文本的形式编写和储存。Python 中原生的文本数据类型叫做字符串,相应的构造器是`str`。 -关于字符串在 Python 中如何表示和操作有许多细节。字符串是丰富抽象的另一个示例,程序员需要满足一些实质性要求来掌握。这一节是字符串基本行为的摘要。 +在Python中,有许多关于如何表示、表达和操作字符串的细节。字符串是丰富抽象的另一个示例,它需要程序员投入大量精力去掌握。本节是字符串基本行为的摘要。 字符串字面值可以表达任意文本,被单引号或者双引号包围。 @@ -314,7 +338,7 @@ Python 序列抽象的这些额外行为的枚举,给我们了一个机会来 '您好' ``` -我们已经在代码中见过字符串了,在`print`的调用中作为文档字符串,以及在`assert`语句中作为错误信息。 +我们已经在我们的代码中见过字符串了,在`print`的调用中作为文档字符串,以及在`assert`语句中作为错误信息。 字符串满足两个基本的序列条件,我们在这一节开始介绍过它们:它们拥有长度并且支持元素选择。 @@ -331,14 +355,13 @@ Python 序列抽象的这些额外行为的枚举,给我们了一个机会来 就像元组,字符串可以通过加法和乘法来组合: ```py ->>> city = 'Berkeley' ->>> len(city) -8 ->>> city[3] -'k' +>>> 'Berkeley' + ', CA' +'Berkeley, CA' +>>> 'Shabu ' * 2 +'Shabu Shabu ' ``` -字符串的行为不同于 Python 中其它序列类型。字符串抽象没有实现我们为元组和范围描述的完整序列抽象。特别地,字符串上实现了成员性运算符`in`,但是与序列上的实现具有完全不同的行为。它匹配子字符串而不是元素。 +**成员性。**字符串的行为不同于 Python 中其它序列类型。字符串的抽象并不符合我们为元组和范围所描述的完整的序列抽象。特别地,字符串上实现了成员性运算符`in`,但是与序列上的实现具有完全不同的行为。它匹配子字符串而不是元素。 ```py >>> 'here' in "Where's Waldo?" @@ -365,7 +388,7 @@ Read more: import this.""" 在上面的打印结果中,`\n`(叫做“反斜杠加 n”)是表示新行的单一元素。虽然它表示为两个字符(反斜杠和 n)。它在长度和元素选择上被认为是单个字符。 -**字符串强制。**字符串可以从 Python 的任何对象通过以某个对象值作为参数调用`str`构造函数来创建,这个字符串的特性对于从多种类型的对象中构造描述性字符串非常实用。 +**字符串强制。**在 Python 中,可以通过调用 str 构造函数,以一个对象值作为参数,从任何对象中创建一个字符串。字符串的这个特性对于从多种类型的对象中构造描述性字符串非常实用。 ```py >>> str(2) + ' is an element of ' + str(digits) @@ -374,7 +397,7 @@ Read more: import this.""" `str`函数可以以任何类型的参数调用,并返回合适的值,这个机制是后面的泛用函数的主题。 -**方法。**字符串在 Python 中的行为非常具有生产力,因为大量的方法都返回字符串的变体或者搜索其内容。一部分这些方法由下面的示例介绍。 +**方法。**字符串在 Python 中的行为非常具有生产力,因为大量的方法都返回字符串的变体或者搜索其内容。下面通过实例介绍其中的一些方法。。 ```py >>> '1234'.isnumeric() @@ -385,13 +408,13 @@ True True ``` -**扩展阅读。**计算机中的文本编码是个复杂的话题。这一章中,我们会移走字符串如何表示的细节,但是,对许多应用来说,字符串如何由计算机编码的特定细节是必要的知识。[Dive Into Python 3 的 4.1 ~ 4.3 节](http://diveintopython3.ep.io/strings.html)提供了字符编码和 Unicode 的描述。 +**扩展阅读。**在计算机中对文本进行编码是一个复杂的话题。这一章中,我们会移走字符串如何表示的细节,但是,对许多应用来说,计算机如何对字符串进行编码的具体细节是必不可少的知识。[Dive Into Python 3 的 4.1 ~ 4.3 节](http://diveintopython3.problemsolving.io/strings.html)提供了字符编码和 Unicode 的描述。 ## 2.3.7 接口约定 在复合数据的处理中,我们强调了数据抽象如何让我们设计程序而不陷入数据表示的细节,以及抽象如何为我们保留灵活性来尝试备用表示。这一节中,我们引入了另一种强大的设计原则来处理数据结构 -- 接口约定的用法。 -接口约定使在许多组件模块中共享的数据格式,它可以混合和匹配来展示数据。例如,如果我们拥有多个函数,它们全部接受序列作为参数并且返回序列值,我们就可以把它们每一个用于上一个的输出上,并选择任意一种顺序。这样,我们就可以通过将函数链接成流水线,来创建一个复杂的过程,每个函数都是简单而专一的。 +接口约定是一种数据格式,它在许多模块化组件中共享,可以混合和匹配来执行数据处理。例如,如果我们有几个函数,它们都以一个序列作为参数,并返回一个序列作为值,我们就可以把它们每一个用于上一个的输出上,并选择任意一种顺序。这样,我们就可以通过将函数链接成流水线,来创建一个复杂的过程,每个函数都是简单而专一的。 这一节有两个目的,来介绍以接口约定组织程序的概念,以及展示模块化序列处理的示例。 @@ -400,7 +423,7 @@ True 1. 对前`n`个斐波那契数中的偶数求和。 2. 列出一个名称中的所有缩写字母,它包含每个大写单词的首字母。 -这些问题是有关系的,因为它们可以解构为简单的操作,它们接受序列作为输入,并产出序列作为输出。而且,这些操作是序列上的计算的一般方法的实例。让我们思考第一个问题,它可以解构为下面的步骤: +这些问题是有关系的,因为它们可以被分解为简单的操作,它们接受序列作为输入,并产出序列作为输出。而且,这些操作是序列上的计算的一般方法的实例。让我们思考第一个问题,它可以分解为以下几个步骤: ``` enumerate map filter accumulate @@ -446,7 +469,7 @@ naturals(n) fib iseven sum 3382 ``` -现在,让我们思考第二个问题。它可以解构为序列操作的流水线,包含`map`和`filter`。 +现在,让我们思考第二个问题。它可以分解为一个序列操作的流水线,包含`map`和`filter`。 ``` enumerate filter map accumulate @@ -505,7 +528,7 @@ enumerate filter map accumulate 生成器表达式是使用可迭代(例如序列)接口约定的特化语法。这些表达式包含了`map`和`filter`的大部分功能,但是避免了被调用函数的实际创建(或者,顺便也避免了环境帧的创建需要调用这些函数)。 -**归约。**在我们的示例中,我们使用特定的函数来累计结果,例如`tuple`或者`sum`。函数式编程语言(包括 Python)包含通用的高阶累加器,具有多种名称。Python 在`functools`模块中包含`reduce`,它对序列中的元素从左到右依次调用二元函数,将序列归约为一个值。下面的表达式计算了五个因数的积。 +**归约。**在我们的示例中,我们使用特定的函数来累计结果,例如`tuple`或者`sum`。函数式编程语言(包括 Python)包含通用的高阶累加器,具有多种名称。Python 在`functools`模块中包含`reduce`,它对序列中的元素从左到右依次调用二元函数,将序列归约为一个值。下面的表达式计算了5的阶乘。 ```py >>> from operator import mul @@ -524,4 +547,4 @@ enumerate filter map accumulate 123476336640 ``` -与`map`、`filter`和`reduce`对应的高阶过程的组合会再一次在第四章出现,在我们思考多台计算机之间的分布式计算方法的时候。 +在第4章中,当我们考虑在多台计算机之间的分布式计算方法时,与`map`、`filter`和`reduce`对应的高阶过程的组合将再次出现。 From 32fd419803320d9571509e6ac7cbdf80b1ccad1a Mon Sep 17 00:00:00 2001 From: wuyudi Date: Mon, 17 Aug 2020 10:46:27 +0800 Subject: [PATCH 2/6] Update 1.1.md --- 1.1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1.1.md b/1.1.md index 375835a..d41e7c6 100644 --- a/1.1.md +++ b/1.1.md @@ -38,7 +38,7 @@ Python适用于作为教学语言,因为纵观它的历史,Python的开发 这些讲义通过使用抽象设计的技巧和严谨的计算模型,来快速介绍Python的特性。此外,这些讲义提供了Python编程的实践简介,包含一些高级语言特性和展示示例。通过这门课,学习Python将会变成自然而然的事情。 -然而,Python是一门生态丰富的语言,带有大量特性和用法。我们讲到基本的计算机科学概念时,会刻意慢慢地介绍他们。对于有经验的学生,他们打算一口气学完语言的所有细节,我们推荐他们阅读Mark Pilgrim的书[Dive Into Python 3](http://diveintopython3.ep.io/),它在网上可以免费阅读。这本书的主题跟这门课极其不同,但是这本书包含了许多关于使用Python的宝贵的实用信息。事先告知:不像这些讲义,Dive Into Python 3需要一些编程经验。 +然而,Python是一门生态丰富的语言,带有大量特性和用法。我们讲到基本的计算机科学概念时,会刻意慢慢地介绍他们。对于有经验的学生,他们打算一口气学完语言的所有细节,我们推荐他们阅读Mark Pilgrim的书[Dive Into Python 3](http://diveintopython3.problemsolving.io/),它在网上可以免费阅读。这本书的主题跟这门课极其不同,但是这本书包含了许多关于使用Python的宝贵的实用信息。事先告知:不像这些讲义,Dive Into Python 3需要一些编程经验。 开始在Python中编程的最佳方法就是直接和解释器交互。这一章会描述如何安装Python3,使用解释器开始交互式会话,以及开始编程。 From eb833a979b8af00185eaa1fe4f09b84de5876a09 Mon Sep 17 00:00:00 2001 From: wuyudi Date: Mon, 17 Aug 2020 10:48:03 +0800 Subject: [PATCH 3/6] Update 2.1.md --- 2.1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.1.md b/2.1.md index cf02c97..963602f 100644 --- a/2.1.md +++ b/2.1.md @@ -100,4 +100,4 @@ Python 中每个对象都拥有一个类型。`type`函数可以让我们查看 名称`float`来源于实数在 Python 中表示的方式:“浮点”表示。虽然数值表示的细节不是这门课的话题,一些`int`和`float`对象的高层差异仍然很重要。特别是,`int`对象只能表示整数,但是表示得更精确,不带有任何近似。另一方面,`float`对象可以表示很大范围内的分数,但是不能表示所有有理数。然而,浮点对象通常用于近似表示实数和有理数,舍入到某个有效数字的数值。 -**扩展阅读。**下面的章节介绍了更多的 Python 原始数据类型,专注于它们在创建实用数据抽象中的作用。Dive Into Python 3 中的[原始数据类型](http://diveintopython3.ep.io/native-datatypes.html)一章提供了所有 Python 数据类型的实用概览,以及如何高效使用它们,还包含了许多使用示例和实践提示。你现在并不需要阅读它,但是要考虑将它作为宝贵的参考。 +**扩展阅读。**下面的章节介绍了更多的 Python 原始数据类型,专注于它们在创建实用数据抽象中的作用。Dive Into Python 3 中的[原始数据类型](http://diveintopython3.problemsolving.io/native-datatypes.html)一章提供了所有 Python 数据类型的实用概览,以及如何高效使用它们,还包含了许多使用示例和实践提示。你现在并不需要阅读它,但是要考虑将它作为宝贵的参考。 From 7e2618eff20bd1f2d6f9700d8308d35377309c9c Mon Sep 17 00:00:00 2001 From: wuyudi Date: Mon, 17 Aug 2020 10:49:55 +0800 Subject: [PATCH 4/6] Update 2.2.md --- 2.2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.2.md b/2.2.md index b73c881..2b9aad4 100644 --- a/2.2.md +++ b/2.2.md @@ -160,7 +160,7 @@ Python 中的元组(以及多数其它编程语言中的序列)下标都以 符合要求。这个修改只通过修改构造器来完成,并没有修改任何实现实际算术运算的函数。 -**扩展阅读。**上面的`str_rat`实现使用了格式化字符串,它包含了值的占位符。如何使用格式化字符串和`format`方法的细节请见 Dive Into Python 3 的[格式化字符串](http://diveintopython3.ep.io/strings.html#formatting-strings)一节。 +**扩展阅读。**上面的`str_rat`实现使用了格式化字符串,它包含了值的占位符。如何使用格式化字符串和`format`方法的细节请见 Dive Into Python 3 的[格式化字符串](http://diveintopython3.problemsolving.io/strings.html#formatting-strings)一节。 ## 2.2.3 抽象界限 From 4c21561eb937a6843acb0d5811ec16b9eaa2778d Mon Sep 17 00:00:00 2001 From: wuyudi Date: Mon, 17 Aug 2020 10:50:45 +0800 Subject: [PATCH 5/6] Update 2.7.md --- 2.7.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.7.md b/2.7.md index da340f0..b42376c 100644 --- a/2.7.md +++ b/2.7.md @@ -186,7 +186,7 @@ ComplexMA(1.0, 3.141592653589793) **扩展阅读。**为了求解含有`+`运算符的表达式,Python 会检查表达式的左操作数和右操作数上的特殊方法。首先,Python 会检查左操作数的`__add__`方法,之后检查右操作数的`__radd__`方法。如果二者之一被发现,这个方法会以另一个操作数的值作为参数调用。 -在 Python 中求解含有任何类型的运算符的表达值具有相似的协议,这包括切片符号和布尔运算符。Python 文档列出了完整的[运算符的方法名称](http://docs.python.org/py3k/reference/datamodel.html#special-method-names)。Dive into Python 3 的[特殊方法名称](http://diveintopython3.ep.io/special-method-names.html)一章描述了许多用于 Python 解释器的细节。 +在 Python 中求解含有任何类型的运算符的表达值具有相似的协议,这包括切片符号和布尔运算符。Python 文档列出了完整的[运算符的方法名称](http://docs.python.org/py3k/reference/datamodel.html#special-method-names)。Dive into Python 3 的[特殊方法名称](http://diveintopython3.problemsolving.io/special-method-names.html)一章描述了许多用于 Python 解释器的细节。 ## 2.7.3 泛用函数 From a01e0416812aa59c50e37decda7ae2e2d62bc667 Mon Sep 17 00:00:00 2001 From: wuyudi Date: Mon, 17 Aug 2020 10:51:38 +0800 Subject: [PATCH 6/6] Update 2.4.md --- 2.4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.4.md b/2.4.md index ee3dadd..43c5447 100644 --- a/2.4.md +++ b/2.4.md @@ -271,7 +271,7 @@ True 列表推导式使用序列的接口约定增强了数据处理的范式,因为列表是一种序列数据类型。 -**扩展阅读。**Dive Into Python 3 的[推导式](http://diveintopython3.ep.io/comprehensions.html)一章包含了一些示例,展示了如何使用 Python 浏览计算机的文件系统。这一章介绍了`os`模块,它可以列出目录的内容。这个材料并不是这门课的一部分,但是推荐给任何想要增加 Python 知识和技巧的人。 +**扩展阅读。**Dive Into Python 3 的[推导式](http://diveintopython3.problemsolving.io/comprehensions.html)一章包含了一些示例,展示了如何使用 Python 浏览计算机的文件系统。这一章介绍了`os`模块,它可以列出目录的内容。这个材料并不是这门课的一部分,但是推荐给任何想要增加 Python 知识和技巧的人。 **实现。**列表是序列,就像元组一样。Python 语言并不提供给我们列表实现的直接方法,只提供序列抽象,和我们在这一节介绍的可变方法。为了克服这一语言层面的抽象界限,我们可以开发列表的函数式实现,再次使用递归表示。这一节也有第二个目的:加深我们对调度函数的理解。