22
33> 迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
44
5- ## 一.可迭代对象
5+ ### 一.可迭代对象
66
7- ### 1.什么是迭代
7+ #### 1.什么是迭代
88
9- 我们已经知道可以对list 、tuple、str等类型的数据使用for ...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历也叫做迭代。
9+ 我们已经知道可以对 list 、tuple、str 等类型的数据使用 for ...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历也叫做迭代。
1010
1111是否所有数据都可以迭代?
1212
@@ -41,13 +41,13 @@ TypeError: 'MyList' object is not iterable
4141# MyList容器的对象也是不能迭代的
4242```
4343
44- 我们自定义了一个容器类型MyList,在将一个存放了多个数据的MyList对象放到for ...in...的语句中,发现for ...in...并不能从中依次取出一条数据返回给我们,也就说我们随便封装了一个可以存放多条数据的类型却并不能被迭代使用。
44+ 我们自定义了一个容器类型 MyList,在将一个存放了多个数据的 MyList 对象放到 for ...in...的语句中,发现 for ...in...并不能从中依次取出一条数据返回给我们,也就说我们随便封装了一个可以存放多条数据的类型却并不能被迭代使用。
4545
46- ### 2.可迭代对象(Iterable)
46+ #### 2.可迭代对象(Iterable)
4747
48- 我们把可以通过for ...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)。
48+ 我们把可以通过 for ...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)。
4949
50- ## 二.如何判断一个对象是否可迭代
50+ ### 二.如何判断一个对象是否可迭代
5151
5252** 方法:**
5353
@@ -78,19 +78,19 @@ Out[55]: False
7878
7979> 注意:
8080>
81- > 现在Iterable类在collections.abc中
81+ > 现在 Iterable 类在 collections.abc 中
8282
83- ## 三.可迭代对象的本质
83+ ### 三.可迭代对象的本质
8484
85- ### 1迭代对象和迭代器
85+ #### 1 迭代对象和迭代器
8686
87- 我们分析对可迭代对象进行迭代使用的过程,发现每迭代一次(即在for ...in...中每循环一次)都会返回对象中的下一条数据,一直向后读取数据直到迭代了所有数据后结束。那么在这个过程中就应该有一个“人”去记录每次访问到了第几条数据,以便每次迭代都可以返回下一条数据。我们把这个能帮助我们进行数据迭代的“人”称为 ** 迭代器(Iterator)**
87+ 我们分析对可迭代对象进行迭代使用的过程,发现每迭代一次(即在 for ...in...中每循环一次)都会返回对象中的下一条数据,一直向后读取数据直到迭代了所有数据后结束。那么在这个过程中就应该有一个“人”去记录每次访问到了第几条数据,以便每次迭代都可以返回下一条数据。我们把这个能帮助我们进行数据迭代的“人”称为 ** 迭代器(Iterator)**
8888
89- ### 2.迭代对象的本质
89+ #### 2.迭代对象的本质
9090
9191可迭代对象的本质就是可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。
9292
93- ### 3.\_\_ iter __ ()方法
93+ #### 3.\_\_ iter \_\_ ()方法
9494
9595可迭代对象通过` __iter__ ` 方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据.
9696
@@ -135,26 +135,25 @@ if __name__ == '__main__':
135135True
136136```
137137
138- 测试发现:添加了\_ _ iter __ 方法的mylist对象已经是一个可迭代对象了
138+ 测试发现:添加了\_\_ iter \_\_ 方法的 mylist 对象已经是一个可迭代对象了
139139
140- > 这里是使用 Iterable 产生警告的,具体警告信息如下:
140+ > 这里是使用 Iterable 产生警告的,具体警告信息如下:
141141>
142142> DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.9 it will stop working from collections import Iterable
143143>
144- > 弃用警告:从 'collections' 而不是 'collections' 使用或导入 abc ,abc' 自 Python 3.3 已弃用,在3.9中将停止工作从 collections 中导入Iterable 。
144+ > 弃用警告:从 'collections' 而不是 'collections' 使用或导入 abc ,abc' 自 Python 3.3 已弃用,在 3.9 中将停止工作从 collections 中导入 Iterable 。
145145>
146146> 解决方法:
147147>
148148> 根据警告分析:启用 Iterable 从 collections 导入,更新为 collections.abc 导入
149149>
150150> 既是更改为以下,警告就会消失:
151151>
152- > from collections import Iterable 更改为 from collections.abc import Iterable
153- >
152+ > from collections import Iterable 更改为 from collections.abc import Iterable
154153
155- ## 四. iter()函数与next ()函数
154+ ### 四. iter()函数与 next ()函数
156155
157- ** list、tuple等都是可迭代对象,我们可以通过iter ()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用next ()函数来获取下一条数据。**
156+ ** list、tuple 等都是可迭代对象,我们可以通过 iter ()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用 next ()函数来获取下一条数据。**
158157
159158> iter()函数实际上就是调用了可迭代对象的` __iter__ ` 方法。
160159
@@ -182,9 +181,9 @@ StopIteration
182181
183182> 注意:
184183>
185- > 当我们已经迭代完最后一个数据之后,再次调用next()函数会抛出StopIteration的异常 ,来告诉我们所有数据都已迭代完成,不用再执行next ()函数了。
184+ > 当我们已经迭代完最后一个数据之后,再次调用 next()函数会抛出 StopIteration 的异常 ,来告诉我们所有数据都已迭代完成,不用再执行 next ()函数了。
186185
187- ## 五. 如何判断一个对象是否是迭代器
186+ ### 五. 如何判断一个对象是否是迭代器
188187
189188可以使用 isinstance() 判断一个对象是否是 Iterator 对象:
190189
@@ -201,23 +200,23 @@ In [59]: isinstance(iter("abc"), Iterator)
201200Out[59]: True
202201```
203202
204- ## 六. 迭代器Iterator
203+ ### 六. 迭代器 Iterator
205204
206205一个实现了` __iter__ ` 方法和` __next__ ` 方法的对象,就是迭代器。
207206
208- ### 1.迭代器作用
207+ #### 1.迭代器作用
209208
210- 用来帮助我们记录每次迭代访问到的位置,当我们对迭代器使用next ()函数的时候,迭代器会向我们返回它所记录位置的下一个位置的数据。
209+ 用来帮助我们记录每次迭代访问到的位置,当我们对迭代器使用 next ()函数的时候,迭代器会向我们返回它所记录位置的下一个位置的数据。
211210
212- ### 2.\_\_ next __ ()方法的作用
211+ #### 2.\_\_ next \_\_ ()方法的作用
213212
214- 在使用next ()函数的时候,调用的就是迭代器对象的` __next__ ` 方法(Python3中是对象的 ` __next__ ` 方法,Python2中是对象的next ()方法)。
213+ 在使用 next ()函数的时候,调用的就是迭代器对象的` __next__ ` 方法(Python3 中是对象的 ` __next__ ` 方法,Python2 中是对象的 next ()方法)。
215214
216- ### 3.构造一个迭代器
215+ #### 3.构造一个迭代器
217216
218217> 实现它的` __next__ ` 方法。
219218>
220- > python要求迭代器本身也是可迭代的 ,所以我们还要为迭代器实现` __iter__ ` 方法,而` __iter__ ` 方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的` __iter__ ` 方法返回自身即可。
219+ > python 要求迭代器本身也是可迭代的 ,所以我们还要为迭代器实现` __iter__ ` 方法,而` __iter__ ` 方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的` __iter__ ` 方法返回自身即可。
221220
222221** 迭代器结构:** :
223222
@@ -226,10 +225,10 @@ class 类名(object):
226225 def __init(self,容器名,参数列表):
227226 self.容器名称 = 容器名
228227 self.计数器名称 = 0
229-
228+
230229 def __iter__(self):
231230 return self
232-
231+
233232 def __next__(self): # next返回的数据就是for遍历到的数据
234233 if self.计数器名称 < len(self.容器名称):
235234 data = self.容器名称[self.计数器名称]
@@ -292,16 +291,16 @@ if __name__ == '__main__':
2922914
293292```
294293
295- ## 七. for...in...循环的本质
294+ ### 七. for...in...循环的本质
296295
297296for ** item** in ** Iterable** 循环
298297
299- 1 . 通过iter()函数获取可迭代对象Iterable的迭代器 ,
300- 2 . 对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束 。
298+ 1 . 通过 iter()函数获取可迭代对象 Iterable 的迭代器 ,
299+ 2 . 对获取到的迭代器不断调用 next()方法来获取下一个值并将其赋值给 item,当遇到 StopIteration 的异常后循环结束 。
301300
302- ## 八. 迭代器的应用场景
301+ ### 八. 迭代器的应用场景
303302
304- ** 迭代器最核心的功能:** 可以通过next ()函数的调用来返回下一个数据值。
303+ ** 迭代器最核心的功能:** 可以通过 next ()函数的调用来返回下一个数据值。
305304
306305如果每次返回的数据值不是在一个已有的数据集合中读取的,而是通过程序按照一定的规律计算生成的,那么也就意味着可以不用再依赖一个已有的数据集合,也就是说不用再将所有要迭代的数据都一次性缓存下来供后续依次读取,这样可以节省大量的存储(内存)空间。
307306
@@ -346,9 +345,9 @@ if __name__ == '__main__':
3463450,1,1,
347346```
348347
349- ## 九. 可迭代对象只是扩展
348+ ### 九. 可迭代对象只是扩展
350349
351- 除了for循环能接收可迭代对象 ,list、tuple等也能接收 。
350+ 除了 for 循环能接收可迭代对象 ,list、tuple 等也能接收 。
352351
353352```
354353li = list(FibIterator(15))
@@ -363,4 +362,3 @@ print(tp)
363362[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
364363(0, 1, 1, 2, 3, 5)
365364```
366-
0 commit comments