python 入坑路-迭代器
迭代器
可以作用域for 循环的数据类型有以下几种:
一类是集合数据类型,如:list,tuple,dict,set,str 等:
一类是 generator ,包括生成器和带 yield 的生成器函数 generator function.
这些可以直接作用域for 循环的对象统称为可迭代对象:Iterable.
可以使用 isinstance() 判断对象是否是 Iterable 对象:
By the way: 可迭代就是可以 循环。可以循环的对象 Iterable
1 from collections import Iterable 2 3 print(isinstance([],Iterable)) 4 5 print(isinstance((),Iterable)) 6 print(isinstance("",Iterable)) 7 print(isinstance(123,Iterable)) 8 9 # 输出 10 True 11 True 12 True 13 False
生成器不但可以作用于 for 循环,还可以被 next()函数不断调用并返回下一个值
知道最好抛出 stopIteration 错误表示无法继续返回下一个值。
可以被 next() 函数调用并不断返回下一个值得对象称为 迭代器:Iterator
可以使用isinstance() 判断一个对象是否是 Iterator 对象:
1 a=isinstance((x for x in range(10)),Iterator) 2 print(a) 3 4 def fib(max): 5 n,a,b=0,0,1 6 while True: 7 yield b 8 a,b=b,a+b 9 n+=1 10 return "niubi" 11 12 b=fib(10) 13 print(type(b)) 14 print(isinstance(b,Iterator)) 15 16 #输入 17 True 18 <class 'generator'> 19 True
by the way : 用 dir 查看可以调用的方法。
生成器都是 Iterable 对象,但是 list,dict str 虽然是Iterable,却不是Iterator
把list ,dict,str等Iterable 变成Iterator ,可以使用函数 Iter()
1 a 2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 3 4 iter(a) 5 <list_iterator at 0x38ae450> 6 7 a 8 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 9 10 type(a) 11 list 12 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 while True: 9 try: 10 x=next(it) 11 except Stopterationg: 12 break
by the way : 文件封装, for 循环 等很多底层都是用这个实现的。重要的概念,必须掌握。

浙公网安备 33010602011771号