(对于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()
函数都可以在地图对象上运行,无论它是什么。
为什么它们都有效?
答案 0 :(得分:11)
迭代器是可迭代的,但是迭代不一定是迭代器。
可迭代是指定义了__iter__
方法的任何内容 - 例如列表和元组,以及迭代器。
迭代器是迭代的子集,其值不能同时被访问,因为它们不是一次全部存储在内存中。这些可以使用map
,filter
和iter
等函数生成,也可以使用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
抱怨,因为列表是一个可迭代的,不是迭代器。