迭代器

 1 #!/usr/bin/env python
 2 # -*- coding=utf-8 -*-
 3 
 4 """
 5 可以直接作用于for循环的对象成为可迭代对象 iterable
 6 1、集合数据类型
 7     list、tuple、dict、set、str
 8 2、generator
 9     包括生成器和带yield的generator
10 """
11 
12 #可以使用isinstance()判断对象是否是 Iterable对象
13 from collections import Iterable
14 
15 isinstance([],Iterable)  #True
16 
17 isinstance({},Iterable)  #True
18 
19 isinstance('abc',Iterable)  #True
20 
21 isinstance((x for x in range(10)),Iterable) #True
22 
23 isinstance(100,Iterable)  #False
24 
25 #可以被next()函数调用并不断返回下一个值得对象称为迭代器  Iterator
26 #可以使用isinstance()判断对象是否是 Iterator对象
27 isinstance(100,Iterator) #False
28 
29 isinstance('abc',Iterator) #False
30 
31 isinstance([],Iterator) #False
32 
33 isinstance((),Iterator) #False
34 
35 isinstance((x for x in range(10)),Iterator) #True
36 
37 '''
38 1、生成器都是Iterator对象
39 2、但list、dict、str虽然是Iterable,却不是Iterator
40     原因:因为Python的Iterator对象表示的是一个数据流,
41     可以把这个数据流看做是一个有序序列,
42     但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据
43     所以Iterator得计算是惰性的,只有在需要返回下一个数据的时候他才会计算      
44 '''
45 
46 #把list、dict、str等Iterable变成Iterator可以使用iter()函数
47 isinstance([],Iterator) #False
48 
49 isinstance(iter([]),Iterator) #True
50 
51 """
52 总结:
53 1、凡是可作用于for循环的对象都是Iterable对象
54 2、凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列
55 3、但list、dict、str虽然是Iterable,却不是Iterator,可以使用iter()函数变成Iterator
56 """
57 
58 #for循环本质就是通过不断调用next()函数实现的:
59 #例如:
60 for x in range(1,10):
61     pass
62 
63 #等价于:
64 
65 #首先获得Iterator对象:
66 it=iter(range(1,10))
67 while True:
68     try:
69         #获得下一个值
70         x=next(it)
71     #遇到StopIteration就退出循环
72     except StopIteration:
73         break

 

posted @ 2017-09-28 11:31  梁颖666  阅读(158)  评论(0编辑  收藏  举报