问题的答案why the __iter__()方法是必要的那是为了for循环总是从打电话开始iter()在一个物体上得到一个迭代器。这就是为什么即使迭代器本身也需要一个__iter__()使用 for 循环的方法。后for calls iter(),然后它调用__下一个__()在结果迭代器上获取一个值。
创建可迭代对象和迭代器的规则是:
1)可迭代对象有一个__iter__()返回迭代器的方法。
2)迭代器有一个__下一个__()返回值、更新状态并引发的方法停止迭代完成时。
3)迭代器本身有一个__iter__()返回的方法self。这意味着所有迭代器都是可自迭代的。
The 最后一条规则的好处对于具有__iter__()返回的方法self是它让我们传递部分消耗的迭代器:
>>> s = 'hello world'
>>> it = iter(s)
>>> next(it)
'h'
>>> next(it)
'e'
>>> list(it) # Doesn't start from the beginning
['l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
这是另一个依赖于迭代器无需重新启动即可自我迭代的示例:
>>> s = 'hello world'
>>> it = iter(s)
>>> list(zip(it, it))
[('h', 'e'), ('l', 'l'), ('o', ' '), ('w', 'o'), ('r', 'l')]
Notes:
1) 制作可迭代的另一种方法是提供__getitem__()接受连续索引并引发的方法索引错误完成时。就是这样strPython 2 中迭代的对象。
2)一些对象(例如文件)是它们自己的迭代器。这意味着您可以致电next()直接在文件对象上。这也意味着文件不能有多个独立的迭代器(文件对象本身具有跟踪文件内位置的状态)。
3) 上面描述的迭代器设计模式不是 Python 特有的。它是许多 OOP 语言的通用设计模式:https://en.wikipedia.org/wiki/Iterator_pattern https://en.wikipedia.org/wiki/Iterator_pattern