我已经阅读了我的材料,它告诉python迭代器必须同时具有__iter__
和__next__
方法,但是迭代只需要__iter__
。我检查一个列表,发现它没有__next__
方法。在其上使用iter()
时,它将成为迭代器。这意味着iter()
会将__next__
方法添加到列表中以将其转换为迭代器?如果是的话,这是怎么发生的?
答案 0 :(得分:4)
没有。 iter
返回迭代器,它不会将列表转换为迭代器。它根本没有修改列表,当然,列表没有得到__next__
方法。
>>> x = [1,2]
>>> it = iter(x)
>>> it
<list_iterator object at 0x101c021d0>
>>> x.__next__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute '__next__'
>>>
列表是 iterables ,而不是迭代器。它们实现了__iter__
方法,因此它们是可迭代的:
>>> x.__iter__
<method-wrapper '__iter__' of list object at 0x101bcf248>
但不是__next__
,因此它们不是迭代器:
>>> next(x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not an iterator
根据定义,迭代器本身是可迭代的,因为它们也实现了__iter__
。考虑:
>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> it = iter(x)
>>> it
<list_iterator object at 0x101c02358>
>>> it.__iter__
<method-wrapper '__iter__' of list_iterator object at 0x101c02358>
大多数迭代器 只需在您使用iter
时自行返回:
>>> it2 = iter(it)
>>> it, it2
(<list_iterator object at 0x101c02358>, <list_iterator object at 0x101c02358>)
>>> it is it2
True
>>>
确实,这是requirement of the iterator protocol:
&#34;迭代器必须有
__iter__()
方法才能返回 迭代器对象本身,所以每个迭代器也是可迭代的,也可能是 在大多数接受其他迭代的地方使用。&#34;
再次注意,它们是相同的迭代器:
>>> next(it)
1
>>> next(it2)
2
>>> next(it)
3
>>> next(it)
4
>>> next(it2)
5
>>> list(it)
[6, 7, 8, 9]
>>> next(it2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
所以迭代器实现__iter__
和__next__
, iterable 只意味着它实现了__iter__
。 __iter__
的返回是一个迭代器,因此必须实现__next__
。