day13 迭代器

迭代器的一些概念


迭代器协议 —— 内部含有__next__和__iter__方法的就是迭代器
迭代器协议和可迭代协议
可以被for循环的都是可迭代的
可迭代的内部都有__iter__方法
只要是迭代器,一定可迭代
可迭代的对象.__iter__()方法就可以得到一个迭代器
迭代器中的__next__()方法可以一个一个的获取值
 
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  这是因为有成了新的迭代器?????
 

猜你喜欢

转载自www.cnblogs.com/caili/p/9757595.html
今日推荐