Iterator vs Iterable?

时间:2013-09-15 06:17:43

标签: python iterator

(对于python 3)

在python文档中,you can see list()函数采用可迭代的方式。

在python docs中,you can also see next()函数采用迭代器。{/ p>

所以我在IDLE做了这个:

>>> var = map(lambda x: x+5, [1,2,3])
>>> var
>>> next(v)
>>> list(v)

给出了输出:

<map object at 0x000000000375F978>
6
[7,8]
坦率地说,这不是我的预期。地图对象是迭代器还是可迭代的?甚至还有区别吗?显然,list()next()函数都可以在地图对象上运行,无论它是什么。

为什么它们都有效?

1 个答案:

答案 0 :(得分:11)

迭代器是可迭代的,但是迭代不一定是迭代器。

可迭代是指定义了__iter__方法的任何内容 - 例如列表和元组,以及迭代器。

迭代器是迭代的子集,其值不能同时被访问,因为它们不是一次全部存储在内存中。这些可以使用mapfilteriter等函数生成,也可以使用yield生成函数。

在您的示例中,map返回一个迭代器,它也是一个可迭代的,这就是两个函数都可以使用它的原因。但是,如果我们以列表为例:

>>> lst = [1, 2, 3]
>>> list(lst)
[1, 2, 3]
>>> next(lst)
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    next(lst)
TypeError: 'list' object is not an iterator

我们可以看到next抱怨,因为列表是一个可迭代的,不是迭代器