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

Разве итераторы Python не получили метод hasNext ?

12 Solutions collect form web for “hasNext в итераторах Python?”

Нет, такого метода нет. Исключение составляет конец итерации. См. Документацию .

Существует альтернатива StopIteration , используя next(iterator, default_value) .

Для exapmle:

 >>> a = iter('hi') >>> print next(a, None) h >>> print next(a, None) i >>> print next(a, None) None 

Таким образом, вы можете обнаружить для None или другого заранее заданного значения для конца итератора, если вы не хотите использовать способ исключения.

Если вам действительно нужна has-next функциональность (потому что вы просто верно переписываете алгоритм из эталонной реализации на Java, скажем, или потому, что вы пишете прототип, который нужно будет легко переписать на 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 функции, поэтому я пытаюсь предупредить такие комментарии за один раз ;-)]]

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

 iter(...).__length_hint__() > 0 

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

 >>> it = iter("hello") >>> for i in it: ... print i ... h e l l o 

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 

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

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

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

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

Вариант использования, который приводит меня к поиску, это следующее

 def setfrom(self,f): """Set from iterable f""" fi = iter(f) for i in range(self.n): try: x = next(fi) except StopIteration: fi = iter(f) x = next(fi) self.a[i] = x 

где hasnext () доступно, можно было бы сделать

 def setfrom(self,f): """Set from iterable f""" fi = iter(f) for i in range(self.n): if not hasnext(fi): fi = iter(f) # restart self.a[i] = next(fi) 

который для меня чище. Очевидно, что вы можете решать проблемы, задавая классы утилиты, но тогда случается, что у вас есть двадцатичетных разных почти эквивалентных обходных пути, каждый из которых связан с их причудами, и если вы хотите повторно использовать код, который использует разные обходные пути, вам нужно либо имеют несколько близких к эквиваленту в одном приложении, или обойти выбор и переписывание кода для использования того же подхода. «Делайте это один раз и делайте это хорошо», максимум терпит неудачу.

Кроме того, сам итератор должен иметь внутреннюю проверку «hasnext», чтобы проверить, нужно ли ему создавать исключение. Эта внутренняя проверка затем скрыта, чтобы ее нужно было протестировать, пытаясь получить элемент, поймав исключение и запустив обработчик, если он был брошен. Это не нужно скрывать ИМО.

Хороший подход для таких вопросов / проблем – проверка того, что у нас есть в каталоге (object / method / iterator / type / class / …)

вы увидите, что dir(iterator) возвращает __length_hint__

iterator.__length_hint__() положителен до конца итерации.

это оно.

Мне это нравится:

 While(True): try: # Do something with the next value iterator.next() except StopIteration: break В While(True): try: # Do something with the next value iterator.next() except StopIteration: break 
  • Python: конвертировать итерацию в поток?
  • каковы правила аннулирования итератора?
  • Предупреждение pyCharm getitem для функций с массивами
  • Итерации по всем парам последовательных элементов из данного списка
  • Python для поведения цикла и итератора
  • истощенные итераторы - что с ними делать?
  • Класс Python, доступный итератором и индексом
  • В python можно лениво генерировать копии итератора с помощью tee?
  • Python - лучший язык программирования в мире.