dict的items()与iteritems()
注意:在 python3 中不存在 iteritems 属性,只有 items 属性,并且返回的是列 表,如果需要其返回迭代器那么,需要显示转换 iter(d.items())
In [3]: d={1:'one',2:'two',3:'three'}
In [4]: d.items()
Out[4]: [(1, 'one'), (2, 'two'), (3, 'three')]
In [5]: d.iteritems()
Out[5]: <dictionary-itemiterator at 0x103b93d60>
In [6]: a = d.iteritems()
In [7]: next(a)
Out[7]: (1, 'one')
In [8]: for i in a:
...: print i
...:
(2, 'two')
(3, 'three')
In [9]: next(a)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-9-3f6e2eea332d> in <module>()
----> 1 next(a)
StopIteration:
iteritems()返回的是一个迭代器,可以使用next()、for来遍历
关于迭代器:
首先要分别出可迭代对象和迭代器
以直接作用于 for 循环的数据类型有以下几种:
一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
一类是 generator ,包括生成器和带 yield 的generator function。
这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。
判断是否是可迭代对象
可以使用 isinstance() 判断一个对象是否是 Iterable 对象
而生成器不但可以作用于 for 循环,还可以被 next() 函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续返回下一个值了。
In [1]: from collections import Iterable
In [2]: isinstance([],Iterable)
Out[2]: True
In [3]: isinstance({},Iterable)
Out[3]: True
In [4]: isinstance('abc',Iterable)
Out[4]: True
In [5]: isinstance((x for x in range(10)),Iterable)
Out[5]: True
In [6]: isinstance([x for x in range(10)],Iterable)
Out[6]: True
In [7]: isinstance(100,Iterable)
Out[7]: False
判断是否是迭代器
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
In [1]: from collections import Iterator
In [2]: isinstance([],Iterator)
Out[2]: False
In [3]: isinstance({},Iterator)
Out[3]: False
In [4]: isinstance('abc',Iterator)
Out[4]: False
In [5]: isinstance((x for x in range(10)),Iterator)
Out[5]: True
In [6]: isinstance([x for x in range(10)],Iterator)
Out[6]: False
In [7]: isinstance(100,Iterator)
Out[7]: False
iter()函数
生成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator 。把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数
In [1]: from collections import Iterable,Iterator
In [2]: isinstance([1,2,3],Iterable)
Out[2]: True
In [3]: isinstance([1,2,3],Iterator)
Out[3]: False
In [4]: isinstance(iter([1,2,3]),Iterable)
Out[4]: True
In [5]: isinstance(iter([1,2,3]),Iterator)
Out[5]: True
总结
- 凡是可作用于 for 循环的对象都是 Iterable 类型;
- 凡是可作用于 next() 函数的对象都是 Iterator 类型
- 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。