在Python 3 documentation中,迭代器协议的定义如下:
迭代器对象本身需要支持以下内容 两种方法,它们共同构成迭代器协议:
iterator.__iter__()
返回迭代器对象本身。这是允许容器和迭代器与for和in语句一起使用所必需的。 此方法对应于类型结构的tp_iter槽 Python / C API中的Python对象。
iterator.__next__()
从容器中返回下一个项目。如果没有其他项,请提高StopIteration异常。这种方法对应于 Python中对象的类型结构的tp_iternext槽 Python / C API。
我尝试通过单个对象属性实现它:
class Empty: pass
o = Empty()
o.__iter__ = lambda: o
o.__next__ = lambda: 42
for i in o: print(i)
得到TypeError
:
TypeError: 'Empty' object is not iterable
有什么问题?在for
循环中,是否有关于哪些对象可用作 iterable 的精确规则?