迭代器
一、迭代器
1、迭代的概念:重复+上一次迭代的结果为下一次迭代的初始值
重复的过程称为迭代,每次重复即一次迭代,
并且每次迭代的结果是下一次迭代的初始值
2、为什么要有迭代器?对于没有索引的数据类型,必须提供一种不依赖索引的迭代方式
3、可迭代的对象:内置__iter__方法的,都是可迭代的对象
1 [1.2].__iter__() 2 'feng'.__iter__() 3 {"bao":123,"feng":123}.__iter__() 4 (1,2).__iter__() 5 {1,2,3,}.__iter__()
4、迭代器:执行__iter__放啊,得到的结果就是迭代器,迭代器对象有__next__方法
1 i = [1,2].__iter__() 2 print(i.__next__()) 3 print(i.__next__())
1 dic_list = {"bao":123,"feng":234,"yun":567} 2 i = dic_list.__iter__() 3 while True: 4 try: 5 key = i.__next__() 6 print(dic_list[key]) 7 except StopIteration: 8 break
1 dic_list = {"bao":123,"feng":234,"yun":567} 2 # i = dic_list.__iter__() 3 i = iter(dic_list) 4 5 while True: 6 try: 7 key = i.__next__() 8 print(dic_list[key]) 9 except StopIteration: 10 break
5、如何判断一个对象是可迭代的对象,还是迭代器对象
1 from collections import Iterable,Iterator 2 'abc'.__iter__() 3 [].__iter__() 4 ().__iter__() 5 {"bao":12}.__iter__() 6 {"feng",}.__iter__() 7 f =open("bao","w") 8 f.__iter__() 9 10 print(isinstance('abc',Iterable)) 11 print(isinstance([],Iterable)) 12 print(isinstance((),Iterable)) 13 print(isinstance({"bao":12},Iterable)) 14 print(isinstance({"feng",},Iterable)) 15 print(isinstance(f,Iterable)) 16 17 print(isinstance('abc',Iterator)) 18 print(isinstance([],Iterator)) 19 print(isinstance((),Iterator)) 20 print(isinstance({"bao":12},Iterator)) 21 print(isinstance({"feng",},Iterator)) 22 print(isinstance(f,Iterator))
6、可迭代对象:只有__iter__方法,执行该方法得到的迭代器对象
迭代协议:
对象有:__next__
对象有:__iter__,对于迭代器对象来说。执行__iter__方法,得到的结果仍然是它本身
1 f1 = f.__iter__() 2 print(f) 3 print(f1) 4 >>><_io.TextIOWrapper name='bao' mode='w' encoding='cp936'> 5 >>><_io.TextIOWrapper name='bao' mode='w' encoding='cp936'>
1 f1 = f.__iter__() 2 print(f) 3 print(f1) 4 >>><_io.TextIOWrapper name='bao' mode='w' encoding='cp936'> 5 >>><_io.TextIOWrapper name='bao' mode='w' encoding='cp936'>
1 dic_bao = {"bao":123,"feng":321,"yun":567} 2 i = dic_bao.__iter__() 3 while True: 4 try: 5 key = next(i) 6 print(key) 7 except StopIteration: 8 break 9 10 for k in dic_bao: 11 print(k) 12 print(dic_bao[k])
7、迭代器的优点和缺点
优点:
1.提供了一种不依赖下标的迭代方式
2.就迭代器本身来说,更节省内存
缺点:
1.无法获取迭代器对象的长度,
2.不如序列类型取值灵活,是一次性的,只能往后取值,不能往前退
1 l = [1,2,3,4,5] 2 i = iter(l) 3 4 print(i) 5 print(next(i))

浙公网安备 33010602011771号