迭代器
可以作用域for 循环的数据类型有以下几种:
一类是集合数据类型,如:list,tuple,dict,set,str 等:
一类是 generator ,包括生成器和带 yield 的生成器函数 generator function.
这些可以直接作用域for 循环的对象统称为可迭代对象:Iterable.
可以使用 isinstance() 判断对象是否是 Iterable 对象:
By the way: 可迭代就是可以 循环。可以循环的对象 Iterable
1 from collections importIterable2
3 print(isinstance([],Iterable))4
5 print(isinstance((),Iterable))6 print(isinstance("",Iterable))7 print(isinstance(123,Iterable))8
9 #输出
10 True11 True12 True13 False
生成器不但可以作用于 for 循环,还可以被 next()函数不断调用并返回下一个值
知道最好抛出 stopIteration 错误表示无法继续返回下一个值。
可以被 next() 函数调用并不断返回下一个值得对象称为 迭代器:Iterator
可以使用isinstance() 判断一个对象是否是 Iterator 对象:
1 a=isinstance((x for x in range(10)),Iterator)2 print(a)3
4 deffib(max):5 n,a,b=0,0,1
6 whileTrue:7 yieldb8 a,b=b,a+b9 n+=1
10 return "niubi"
11
12 b=fib(10)13 print(type(b))14 print(isinstance(b,Iterator))15
16 #输入
17 True18
19 True
by the way : 用 dir 查看可以调用的方法。
生成器都是 Iterable 对象,但是 list,dict str 虽然是Iterable,却不是Iterator
把list ,dict,str等Iterable 变成Iterator ,可以使用函数 Iter()
1 a2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]3
4 iter(a)5
6
7 a8 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]9
10 type(a)11 list12
13 c=iter(a)14
15 type(c)16 list_iterator
你可能会问,为什么 list dict str 等数据类型不是一个 Iterator?
因为PYTHON 的Iterator 对象时一个数据留,
迭代器:可以看做是一个有序序列,但是却不能提前知道序列的长度,只有不断通过next()
函数实现 按需计算一下数据,所以Iterator的计算惰性,只有在需要返回下一个数据时才会计算
by the way:惰性计算,只有走到这一步才计算,不像列表已经计算好了
Iterator 甚至可以表示一个无限大的数据流。
小结:
凡是可以作用域for 循环的对象都是 Iterable 类型
凡是可以作用域next() 函数的对象都是Iterator类型,它表示一个惰性序列:
集合数量类型,如 list dict, str ,set 等是Iterable 但是不能Iterator,
可以通过 iter() 函数获得一个Iterator() 对象。
by the way: 在py 3.x range(10) range(0,10) 相当于迭代器
在py 2.x, range(10) 是生成一个0,1,2,3,4...9 列表, xrange 相当于 3.0 range()
python ,for 其实就是通过 next() 实现的,
1 for x in [1,2,3,4,5,,6]:2 pass
3
4
5 #等价于
6
7 it=iter([1,2,3,4,5,6])8 whileTrue:9 try:10 x=next(it)11 exceptStopterationg:12 break
by the way : 文件封装, for 循环 等很多底层都是用这个实现的。重要的概念,必须掌握。