迭代器的一些概念
迭代器协议 —— 内部含有__next__和__iter__方法的就是迭代器
迭代器协议和可迭代协议
可以被for循环的都是可迭代的
可迭代的内部都有__iter__方法
只要是迭代器,一定可迭代
可迭代的对象.__iter__()方法就可以得到一个迭代器
迭代器中的__next__()方法可以一个一个的获取值
可以被for循环的都是可迭代的
可迭代的内部都有__iter__方法
只要是迭代器,一定可迭代
可迭代的对象.__iter__()方法就可以得到一个迭代器
迭代器中的__next__()方法可以一个一个的获取值
for循环其实就是在使用迭代器
只有 是可迭代对象的时候,才能用for
当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代。
只有 是可迭代对象的时候,才能用for
当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代。
迭代器的好处:
1、从容器类型中一个一个的取值,会把所有的值都取到。
2、节省内存空间
迭代器并不会在内存中再占用一大块内存,而是随着循环每次生成一个,每次next每次给我一个。
例一:
1 from collections import Iterable 2 from collections import Iterator 3 4 class A: 5 def __iter__(self):pass 6 def __next__(self):pass 7 8 a = A() 9 print(isinstance(a,Iterator)) 10 print(isinstance(a,Iterable)) 11 12 13 结果:#同时含有__iter__和__next__方法,所以a既是可迭代的,也是迭代器。 14 True 15 True
例二:
1 from collections import Iterable 2 from collections import Iterator 3 4 class A: 5 #def __iter__(self):pass 6 def __next__(self):pass 7 8 a = A() 9 print(isinstance(a,Iterator)) 10 print(isinstance(a,Iterable)) 11 12 结果: #注释掉def __iter__(self):pass后,a不是可迭代的,更不是迭代器 13 Flase 14 Flase
例三:
1 from collections import Iterable 2 from collections import Iterator 3 4 class A: 5 def __iter__(self):pass 6 #def __next__(self):pass 7 8 a = A() 9 print(isinstance(a,Iterator)) 10 print(isinstance(a,Iterable)) 11 12 结果: #注释掉def __next__(self):pass后,a是可迭代的,但不是迭代器。 13 Flase 14 True
例四:
1 list_A=[1,2,3,4,5] 2 print(list_A.__iter__()) #可迭代对象执行__iter__方法后就形成了迭代器,这打印初迭代器的内存地址<list_iterator object at 0x000001AE9F6CD898> 3 4 ret=list_A.__iter__() 5 print(ret.__next__()) #1 6 print(ret.__next__()) #2 7 print(ret.__next__()) #3 8 9 print(list_A.__iter__().__next__()) #1 10 print(list_A.__iter__().__next__()) #1 这是因为有成了新的迭代器?????