Python迭代器的hasnext()方法?

245 投票
20 回答
235087 浏览
提问于 2025-04-15 17:24

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

不,没有这样的办法。迭代结束是通过抛出一个异常来表示的。你可以查看文档了解更多信息。

撰写回答