我正在研究Alex Marteli的《 Nutshell》中的Python,该书建议具有next()
方法的任何对象都是(或至少可以用作)迭代器。它还建议大多数迭代器是通过对称为的方法的隐式或显式调用构建的iter
。
阅读本书中的内容后,我感到有尝试的渴望。我启动了python 2.7.3解释器并执行以下操作:
>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for number in range(0, 10):
... print x.next()
但是结果是这样的:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: 'list' object has no attribute 'next'
在混乱中,我尝试通过研究x对象的结构,dir(x)
并发现它具有一个__iter__
功能对象。因此,我弄清楚了它可以用作迭代器,只要它支持该类型的接口即可。
因此,当我再次尝试时,这次稍有不同,尝试这样做:
>>> _temp_iter = next(x)
我收到此错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list object is not an iterator
但是列表如何不能成为迭代器,因为它似乎支持此接口,并且可以肯定地在以下情况下用作一个迭代器:
>>> for number in x:
... print x
有人可以帮我澄清一下这个想法吗?
next
只是返回self
,因此您可以调用iter(iter(iter(iter(x))))
并获得与相同的东西iter(x)
。这就是为什么for
在不进行类型嗅探的情况下(而不考虑性能优化)使用迭代器和迭代器的原因。