|
4 | 4 | "cell_type": "markdown", |
5 | 5 | "metadata": {}, |
6 | 6 | "source": [ |
7 | | - "# 迭代器 \n", |
8 | | - "## 迭代协议:文件迭代器 \n", |
| 7 | + "# 1. 迭代器 \n", |
| 8 | + "## 1.1 迭代协议:文件迭代器 \n", |
9 | 9 | "已打开的文件对象有个方法名为 readline,可以一次从一个文件中读取一行文本,每次调用 readline 方法时,就会前进到下一列。到达文件末尾时,就会返回空字符串,我们可以通过它来检测,从而跳出循环。" |
10 | 10 | ] |
11 | 11 | }, |
|
246 | 246 | "cell_type": "markdown", |
247 | 247 | "metadata": {}, |
248 | 248 | "source": [ |
249 | | - "## 手动迭代:iter 和 next \n", |
| 249 | + "## 1.2 手动迭代:iter 和 next \n", |
250 | 250 | "为了支持手动迭代代码,Python 3.X 还提供了一个内置函数 next,它会自动调用一个对象的 `__next__` 方法。给定一个可迭代对象X,调用 `next(X)` 等同于 `X.__next__()`。" |
251 | 251 | ] |
252 | 252 | }, |
|
589 | 589 | "cell_type": "markdown", |
590 | 590 | "metadata": {}, |
591 | 591 | "source": [ |
592 | | - "## 其他内置类型迭代器 \n", |
| 592 | + "## 1.3 其他内置类型迭代器 \n", |
593 | 593 | "遍历字典键的经典方法是明确地获取其键的列表。" |
594 | 594 | ] |
595 | 595 | }, |
|
923 | 923 | "collapsed": true |
924 | 924 | }, |
925 | 925 | "source": [ |
926 | | - "# 列表解析 \n", |
| 926 | + "# 2. 列表解析 \n", |
927 | 927 | "列表解析是最常应用迭代协议的环境之一。在遍历一个列表的时候,可以使用 range 来修改它:" |
928 | 928 | ] |
929 | 929 | }, |
|
989 | 989 | "cell_type": "markdown", |
990 | 990 | "metadata": {}, |
991 | 991 | "source": [ |
992 | | - "## 列表解析基础知识 \n", |
| 992 | + "## 2.1 列表解析基础知识 \n", |
993 | 993 | "从语法上讲,列表解析的语法源自于集合理论表示法中的一个结构,该结构对集合中的每个元素应用一个操作。列表解析看上去就像是一个反向的 for 循环。 \n", |
994 | 994 | "\n", |
995 | 995 | "列表解析写在一个方括号中,因为它们最终是构建一个新的列表的方式。它们以一个任意的表达式开始,该表达式使用我们所组成的一个循环变量(x + 10)。后面跟着看做是一个 for 循环头部的部分,它声明了循环变量,以及一个可迭代对象(for x in L)。 \n", |
|
998 | 998 | "\n", |
999 | 999 | "此外,列表解析比手动的 for 循环语句运行的更快,因为它们的迭代在解释器内部是以 C 语言的速度执行的。 \n", |
1000 | 1000 | "\n", |
1001 | | - "## 在文件上使用列表解析 \n", |
| 1001 | + "## 2.2 在文件上使用列表解析 \n", |
1002 | 1002 | "当我们开始考虑在一个序列中的每项上执行一个操作时,都可以考虑使用列表解析。" |
1003 | 1003 | ] |
1004 | 1004 | }, |
|
1118 | 1118 | "cell_type": "markdown", |
1119 | 1119 | "metadata": {}, |
1120 | 1120 | "source": [ |
1121 | | - "## 扩展的列表解析语法 \n", |
| 1121 | + "## 2.3 扩展的列表解析语法 \n", |
1122 | 1122 | "**过滤语句:if** \n", |
1123 | | - "表达式中嵌套的 for 训话可以有一个相关的 if 子句,来过滤那些测试 不为真的结果项:" |
| 1123 | + "表达式中嵌套的 for 循环可以有一个相关的 if 子句,来过滤那些测试不为真的结果项:" |
1124 | 1124 | ] |
1125 | 1125 | }, |
1126 | 1126 | { |
|
1208 | 1208 | "cell_type": "markdown", |
1209 | 1209 | "metadata": {}, |
1210 | 1210 | "source": [ |
1211 | | - "# 其他迭代环境 \n", |
| 1211 | + "# 3. 其他迭代环境 \n", |
1212 | 1212 | "实现了迭代协议的任何工具,都能够在提供了该工具的任何内置类型或用户定义的类上自动地工作。 \n", |
1213 | 1213 | "在对象中从左到右扫描的每种工具都使用了迭代协议,这包括我们介绍过的 for 循环。 \n", |
1214 | 1214 | "\n", |
|
1524 | 1524 | "collapsed": true |
1525 | 1525 | }, |
1526 | 1526 | "source": [ |
1527 | | - "# Python 3.X 中的新的可迭代对象 \n", |
1528 | | - "## range 迭代器 \n", |
| 1527 | + "# 4. Python 3.X 中的新的可迭代对象 \n", |
| 1528 | + "## 4.1 range 迭代器 \n", |
1529 | 1529 | "在 Python 3.X 中,它返回一个迭代器,该迭代器根据需要产生范围中的数字,而不是在内存中构建一个结果列表。" |
1530 | 1530 | ] |
1531 | 1531 | }, |
|
1682 | 1682 | "cell_type": "markdown", |
1683 | 1683 | "metadata": {}, |
1684 | 1684 | "source": [ |
1685 | | - "## map、zip 和 filter 迭代器 \n", |
| 1685 | + "## 4.2 map、zip 和 filter 迭代器 \n", |
1686 | 1686 | "map、zip 和 filter 内置函数在 Python 3.X 中也转变成迭代器以节约内存空间。 \n", |
1687 | 1687 | "\n", |
1688 | 1688 | "和 range 不同,它们都是自己的迭代器——在遍历其结果一次之后,它们就用尽了。换句话说,就是不能在它们的结果上拥有保持不同位置的多个迭代器。" |
|
1954 | 1954 | "cell_type": "markdown", |
1955 | 1955 | "metadata": {}, |
1956 | 1956 | "source": [ |
1957 | | - "## 多个迭代器 vs 单个迭代器 \n", |
| 1957 | + "## 4.3 多个迭代器 vs 单个迭代器 \n", |
1958 | 1958 | "range 对象支持 len 和索引,它不是自己的迭代器(手动迭代时,使用 iter 产生一个迭代器),并且,它支持在其结果上的多个迭代器,这些迭代器会记住它们各自的位置:" |
1959 | 1959 | ] |
1960 | 1960 | }, |
|
2159 | 2159 | "cell_type": "markdown", |
2160 | 2160 | "metadata": {}, |
2161 | 2161 | "source": [ |
2162 | | - "## 字典视图迭代器 \n", |
| 2162 | + "## 4.4 字典视图迭代器 \n", |
2163 | 2163 | "在 Python 3.X 中,字典的 keys、values 和 items 方法返回可迭代的视图对象,它们一次产生一个结果项,而不是在内存中一次产生全部结果列表。" |
2164 | 2164 | ] |
2165 | 2165 | }, |
|
0 commit comments