Python迭代器的hasnext()方法?
Python 的迭代器有 hasnext
这个方法吗?
20 个回答
49
不可以,不过你可以自己写一个可迭代的包装类来实现这个功能:
from collections.abc import Iterator
class hn_wrapper(Iterator):
def __init__(self, it):
self.it = iter(it)
self._hasnext = None
def __iter__(self):
return self
def __next__(self):
if self._hasnext:
result = self._thenext
else:
result = next(self.it)
self._hasnext = None
return result
def hasnext(self):
if self._hasnext is None:
try:
self._thenext = next(self.it)
except StopIteration:
self._hasnext = False
else:
self._hasnext = True
return self._hasnext
然后你可以这样使用它:
x = hn_wrapper('ciao')
while x.hasnext():
print(next(x))
这样它就会输出:
c
i
a
o
368
捕获 StopIteration
的另一种方法是使用 next(iterator, default_value)
。
举个例子:
>>> a = iter('hi')
>>> print(next(a, None))
h
>>> print(next(a, None))
i
>>> print(next(a, None))
None
这样的话,如果你不想通过异常来处理,就可以检查 None
来判断是否已经到达迭代器的末尾。
如果你的可迭代对象中可能包含 None
值,那么你需要定义一个特殊的值来进行检查:
>>> sentinel = object()
>>> a = iter([None, 1, 2])
>>> elem = next(a, sentinel)
>>> if elem is sentinel:
... print('end')
...
>>>
158
不,没有这样的办法。迭代结束是通过抛出一个异常来表示的。你可以查看文档了解更多信息。