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 循环 等很多底层都是用这个实现的。重要的概念,必须掌握。

 

posted @ 2018-01-02 16:52  东郭仔  阅读(215)  评论(0)    收藏  举报