6

(对于蟒蛇 3)

在 python 文档中,您可以看到list()函数采用可迭代对象。

在 python 文档中,您还可以看到next()函数采用迭代器。

所以我在 IDLE 中这样做了:

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

这给出了输出:

<map object at 0x000000000375F978>
6
[7,8]

坦率地说,这不是我所期望的。地图对象是迭代器还是可迭代对象?甚至有区别吗?显然list()next()函数都适用于地图对象,无论它是什么。

为什么他们都工作?

4

1 回答 1

19

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

可迭代是任何__iter__定义了方法的东西——例如列表和元组,以及迭代器。

迭代器是可迭代对象的子集,它们的值不能同时访问,因为它们不是一次都存储在内存中。这些可以使用和等函数生成map,也可以使用.filteriteryield

在您的示例中,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抱怨,因为列表,一个可迭代的,不是一个迭代器

于 2013-09-15T06:23:29.233 回答