hasNext в итераторах Python?

Не имейте полученного a итераторов Python hasNext метод?

141
задан Georg Schölly 27 December 2009 в 19:39
поделиться

8 ответов

Нет, такого метода нет. Конец итерации обозначается исключением. См. документацию -.

.
93
ответ дан 23 November 2019 в 23:08
поделиться

Если вам действительно нужна функциональность has-next (потому что вы просто добросовестно транскрибируете алгоритм из реализации ссылки на Java, скажем, или потому что вы пишите прототип, который will должен быть легко транскрибирован на Java, когда он закончен), то легко получить его с помощью небольшого оберточного класса. Например:

class hn_wrapper(object):
  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

по мере необходимости.

Обратите внимание, что использование next(sel.it) как встроенного требует Python 2.6 или лучше; если вы используете более старую версию Python, используйте self.it.next() вместо этого (и аналогично для next(x) в примере использования). [[Вы можете обоснованно считать эту заметку излишней, так как Python 2.6 существует уже более года -- но чаще, когда я использую функции Python 2.6 в ответе, какой-нибудь комментатор или другой человек чувствует себя обязанным указать, что они являются 2.6 функциями, таким образом, я пытаюсь предупредить такие комментарии хоть раз;-)]

.
36
ответ дан 23 November 2019 в 23:08
поделиться

В дополнение ко всем упоминаниям StopIteration, цикл Python "for" просто делает то, что вы хотите:

>>> it = iter("hello")
>>> for i in it:
...     print i
...
h
e
l
l
o
13
ответ дан 23 November 2019 в 23:08
поделиться

hasNext несколько переводится на StopIteration исключение, например:

>>> it = iter("hello")
>>> it.next()
'h'
>>> it.next()
'e'
>>> it.next()
'l'
>>> it.next()
'l'
>>> it.next()
'o'
>>> it.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
5
ответ дан 23 November 2019 в 23:08
поделиться

Можно tee итератор, используя, itertools.tee, и проверить StopIteration на итераторе teed.

.
4
ответ дан 23 November 2019 в 23:08
поделиться

Нет. Наиболее похожая концепция, скорее всего, StopIteration exception.

3
ответ дан 23 November 2019 в 23:08
поделиться

Я полагаю, что у питона только что появилась следующая() и, согласно доку, он бросает исключение, что элементов больше нет.

http://docs.python.org/library/stdtypes.html#iterator-types

2
ответ дан 23 November 2019 в 23:08
поделиться

Попробуйте метод __length_hint__() от любого объекта итератора:

iter(...).__length_hint__() > 0
7
ответ дан 23 November 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: