我是Python的新手。我正在使用Python 3.3.2并且我很难弄清楚为什么会出现以下代码:
strList = ['1','2','3']
intList = map(int,strList)
largest = max(intList)
smallest = min(intList)
给我这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: min() arg is an empty sequence
但是这段代码:
strList = ['1','2','3']
intList = list(map(int,strList))
largest = max(intList)
smallest = min(intList)
完全没有错误。
我的想法是,当intList被赋值给map函数的返回值时,它会变成迭代器而不是列表,如the docs所示。也许作为调用max()
的副作用,迭代器已经迭代到列表的末尾,导致Python相信列表是空的(我在这里从C知识中提取,我不熟悉迭代器如何在Python中真正起作用。)我必须支持的唯一证据是,对于第一个代码块:
>>> type(intList)
<class 'map'>
而对于第二个代码块:
>>> type(intList)
<class 'list'>
有人可以确认或否认这个吗?
答案 0 :(得分:17)
你完全正确。在Python 3中,map
返回一个迭代器,你只能迭代一次。如果你第二次遍历迭代器,它会立即引发StopIteration
,就像它是空的一样。 max
消耗整个事物,min
将迭代器视为空。如果您需要多次使用这些元素,则需要调用list
来获取列表而不是迭代器。
答案 1 :(得分:6)
来自map
文档:
返回一个迭代器,它将函数应用于每个iterable项,产生结果。
和http://docs.python.org/3/library/stdtypes.html#typeiter
一旦迭代器的 next ()方法引发StopIteration,它必须在后续调用中继续这样做。
因此,无论基础数据对象如何,迭代器只能使用一次。它建立在发电机的概念之上。
可以使用 itertools.tee
从一个中创建多个独立的迭代器。
l1,l2 = itertools.tee(intList,2)
max(l1)
min(l2)