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