7 迭代器 可迭代对象

1. 可迭代对象

以直接作用于 for 循环的数据类型有以下几种:

一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;

一类是 generator ,包括生成器和带 yield 的generator function。

这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。

 

In [2]: for i in [1,2,3,4]:
   ...:     print(i)
   ...:     
1
2
3
4

In [3]: for i in "abc":
   ...:     print(i)
   ...:     
a
b
c
 

 

 

### 生成器
In [6]: b = (x for x in range(10))

In [7]: b
Out[7]: <generator object <genexpr> at 0x7f8b5d47d7d0>

In [8]: for temp in b:
   ...:     print(temp)
   ...:     
0
1
2
3
4
5
6
7
8
9

 

2. 判断是否可以迭代

可以使用 isinstance() 判断一个对象是否是 Iterable 对象:

In [50]: from collections import Iterable

In [51]: isinstance([], Iterable)
Out[51]: True

In [52]: isinstance({}, Iterable)
Out[52]: True

In [53]: isinstance('abc', Iterable)
Out[53]: True

In [54]: isinstance((x for x in range(10)), Iterable)
Out[54]: True

In [55]: isinstance(100, Iterable)
Out[55]: False

 

 

3.判断迭代器 

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

可以使用 isinstance() 判断一个对象是否是 Iterator 对象:

In [56]: from collections import Iterator

In [57]: isinstance((x for x in range(10)), Iterator)   #生成器是可迭代对象
Out[57]: True

In [58]: isinstance([], Iterator)
Out[58]: False

In [59]: isinstance({}, Iterator)
Out[59]: False

In [60]: isinstance('abc', Iterator)
Out[60]: False

In [61]: isinstance(100, Iterator)
Out[61]: False

 

 4 迭代对象变成迭代器    iter()函数

生成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator 。

把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数:

In [6]: a = [11,22,33,44]

In [7]: type(a)
Out[7]: list

In [8]: iter(a)
Out[8]: <list_iterator at 0x7f5804a4f550>

In [9]: b = iter(a)

In [10]: b
Out[10]: <list_iterator at 0x7f5804a4ff60>

In [11]: b.__next__()
Out[11]: 11

In [12]: b.__next__()
Out[12]: 22

In [13]: b.__next__()
Out[13]: 33

 

 

总结

  • 凡是可作用于 for 循环的对象都是 Iterable 类型;
  • 凡是可作用于 next() 函数的对象都是 Iterator 类型
  • 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。
posted @ 2017-11-30 09:02  venicid  阅读(150)  评论(0编辑  收藏  举报