迭代器

一、迭代器

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
View Code
 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
View Code

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))
View Code

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'>
View Code
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'>
View Code
 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])
View Code

7、迭代器的优点和缺点

优点:

  1.提供了一种不依赖下标的迭代方式

  2.就迭代器本身来说,更节省内存

缺点:

  1.无法获取迭代器对象的长度,

  2.不如序列类型取值灵活,是一次性的,只能往后取值,不能往前退

1 l = [1,2,3,4,5]
2 i = iter(l)
3 
4 print(i)
5 print(next(i))
View Code

 

posted @ 2017-05-23 12:00  Sober--Never  阅读(87)  评论(0)    收藏  举报