Python 迭代器与可数?
(对于python 3) 在python文档中,Python 迭代器与可数?,python,iterator,Python,Iterator,(对于python 3) 在python文档中,list() 在python文档中,next()函数使用迭代器 所以我在空闲时做了这件事: >>> var = map(lambda x: x+5, [1,2,3]) >>> var >>> next(v) >>> list(v) 它给出了输出: <map object at 0x000000000375F978> 6 [7,8] 6. [7,8] 坦率地说
list()
在python文档中,next()
函数使用迭代器
所以我在空闲时做了这件事:
>>> var = map(lambda x: x+5, [1,2,3])
>>> var
>>> next(v)
>>> list(v)
它给出了输出:
<map object at 0x000000000375F978>
6
[7,8]
6.
[7,8]
坦率地说,这不是我所期望的。映射对象是迭代器还是iterable?有什么区别吗?显然,list()
和next()
函数都在映射对象上工作,不管它是什么
为什么它们都能工作?迭代器是一个iterable,但iterable不一定是迭代器
iterable是任何定义了\uuu iter\uuu
方法的东西,例如列表、元组以及迭代器
迭代器是iterables的一个子集,其值不能全部同时访问,因为它们不是一次性存储在内存中。可以使用诸如map
、filter
和iter
等函数以及使用yield
的函数生成这些函数
在您的示例中,map
返回一个迭代器,它也是一个iterable,这就是为什么两个函数都使用它。但是,如果我们以列表为例:
>>> 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
>lst=[1,2,3]
>>>列表(lst)
[1, 2, 3]
>>>下一站(lst)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
下一站(lst)
TypeError:“list”对象不是迭代器
我们可以看到next
抱怨,因为列表,一个iterable,不是迭代器。python文档说map
的结果总是一个列表,考虑到您的结果,这看起来很奇怪。您是对的。在Python3中,它说“返回一个迭代器”,所以您就有了答案。我只是做了一个谷歌搜索,使用了第一个结果,没有检查版本。@LasseV.Karlsen在Python 3中,大多数函数,range
,filter
,map
,开始返回迭代器。它的内存效率更高,(不再是xrange
)“迭代器是iterables的一个子集,它们的值不能同时访问,因为它们不是一次全部存储在内存中”:这是完全错误的。例如,如果您在2025年之前阅读此内容,则Python3的范围(10000000000000000)
iterable的值无法放入笔记本电脑的内存中。然而,这个iterable不是迭代器。正确的定义是“迭代器是具有next
method的iterables的子集。”