iterable需要实现__iter__
method or a __getitem__
method:
如果一个对象实现了__iter__()
或__getitem__()
,那么它可以用for
进行迭代.
迭代器需要一个__iter__
方法(返回self
)和一个__next__
方法(我不能__iter__
%确定__next__
).
it is true that an iterator always has __iter__
method?
对
这也记录在Data model:
object.__iter__(self)
当容器需要迭代器时,调用此方法.这个方法应该返回一个新的迭代器对象,它可以遍历容器中的所有对象.对于映射,它应该迭代容器的键.
Iterator objects also need to implement this method; they are required to return themselves.有关迭代器对象的更多信息,请参阅迭代器类型.
(我的)
关于你的第二个问题:
迭代器也是iterable吗?
是的,因为它有一个__iter__
的方法.
附加说明
除了正式的实现,只需判断是否可以调用iter()
,就可以很容易地判断某个东西是否可以:
def is_iterable(something):
try:
iter(something)
except TypeError:
return False
else:
return True
同样地,也可以通过判断调用某个对象的iter()
是否返回自身来判断该对象是否是迭代器:
def is_iterator(something):
try:
return iter(something) is something # it needs to return itself to be an iterator
except TypeError:
return False
但不要在开发代码中使用它们,它们只是为了"可视化".大多数情况下,你只需要使用for ... in ...
对某个对象进行迭代器,或者如果你需要迭代器,你可以使用iterator = iter(...)
,然后通过调用next(iterator)
来处理迭代器,直到它抛出StopIteration
.