답변:
아니요, 그러한 방법은 없습니다. 반복 종료는 예외로 표시됩니다. 설명서를 참조하십시오 .
unnext()
호출하여 존재하는지 확인한 후 첫 번째 요소를 다시 넣는 방법 이 있으면 try catch 솔루션을 수락합니다 next()
.
yield
). 상점의 결과가 있음은 물론, 어려운 일이 아니다 어댑터를 작성하는 것입니다 next()
및 제공 has_next()
하고 move_next()
.
hasNext()
메소드 를 구현할 수 있습니다 (성공하면 true를 생성, 캐시 및 리턴하거나 실패하면 false를 리턴 함). 그리고 모두 hasNext()
와 next()
기본 공통에 달려 getNext()
방법 및 캐시 항목을 선택합니다. 나는 next()
그것을 제공하는 어댑터를 구현하기가 너무 쉬운 경우 왜 표준 라이브러리에 있지 않아야하는지 알지 못합니다.
next()
및 hasNext()
방법에 영향을 미친다 ). 그래서 그래, next()
및 hasNext()
스캔 스트림의 내용에 의존하는 경우 까다로운 될 때 요소를 읽습니다.
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
예외적 인 방법을 원하지 않으면 반복자 끝의 미리 지정된 값을 감지 하거나 다른 값을 감지 할 수 있습니다 .
sentinel = object()
와 next(iterator, sentinel)
와 테스트를 is
.
unittest.mock.sentinel
명시 적으로 next(a, sentinel.END_OF_ITERATION)
다음 을 쓸 수있는 내장 객체를 사용 if next(...) == sentinel.END_OF_ITERATION
당신이 정말로 경우 필요has-next
(방금 충실하게 말하자면, 자바 참조 구현에서 알고리즘을 전사하고 있기 때문에, 또는 프로토 타입 작성하고 있기 때문에 기능을 한다 가 완성 된 때 쉽게 자바에 복사 할 필요를), 그것은 쉽게 작은 래퍼 클래스로 가져옵니다. 예를 들면 다음과 같습니다.
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)
사용하십시오 (예제 사용법 과 유사 ). [[파이썬 2.6이 1 년 넘게 사용되어 왔기 때문에이 노트가 중복되었다고 생각할 수도 있습니다. 그러나 응답에 파이썬 2.6 기능을 사용할 때보 다 자주, 일부 주석가 또는 다른 사람들이 지적해야 할 의무가 있다고 생각합니다) 그것들 은 2.6 가지 기능이므로, 그런 의견을 한 번만 포기하려고합니다 ;-)]]
has_next
메소드 가 필요한 최악의 이유 입니다. 파이썬의 디자인은 filter
배열에 주어진 술어와 일치하는 요소가 포함되어 있는지 확인하는 데 사용할 수 없습니다 . 파이썬 커뮤니티의 오만과 근시안은 엄청납니다.
TypeError: iter() returned non-iterator
map
및 any
대신에 filter
,하지만 당신은 사용할 수 있습니다 SENTINEL = object(); next(filter(predicate, arr), SENTINEL) is not SENTINEL
또는 잊지 SENTINEL
그냥 사용 try: except
하고 잡아 StopIteration
.
반복자 객체에서 __length_hint __ () 메소드를 시도하십시오.
iter(...).__length_hint__() > 0
__init__
하고 __main__
? Imho, 당신이 그것을 정당화하려고 시도하더라도 그것은 엉망입니다.
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
문서 : http://docs.python.org/library/exceptions.html#exceptions.StopIteration나는 파이썬에 next ()가 있다고 생각하고 문서에 따르면 더 이상 요소가 없다면 예외가 발생합니다.
이것을 검색하게하는 유스 케이스는 다음과 같습니다.
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)
나에게 더 깨끗합니다. 분명히 유틸리티 클래스를 정의하여 문제를 해결할 수 있지만, 그 결과로 각각의 단점이있는 20 가지의 거의 동등한 대안이 확산되고 다른 해결 방법을 사용하는 코드를 재사용하려면 다음 중 하나를 수행해야합니다. 단일 응용 프로그램에서 거의 동등한 여러 항목을 사용하거나 동일한 접근 방식을 사용하기 위해 코드를 골라 다시 작성하십시오. '한 번하고 잘해라'는 맥심은 나쁘다.
또한, 반복자 자체는 예외를 제기해야하는지 확인하기 위해 내부 'hasnext'검사를 수행해야합니다. 그런 다음이 내부 검사는 숨겨져 있으므로 항목을 가져 오려고 시도하고 예외를 포착하고 처리 된 경우 처리기를 실행하여 테스트해야합니다. 이것은 숨기기 IMO를 숨길 필요가 없습니다.
권장되는 방법은 StopIteration 입니다. tutorialspoint 에서 피보나치 예제를 참조하십시오
#!usr/bin/python3
import sys
def fibonacci(n): #generator function
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(5) #f is iterator object
while True:
try:
print (next(f), end=" ")
except StopIteration:
sys.exit()
내 문제를 해결하는 방법은 지금까지 반복 된 객체 수를 유지하는 것입니다. 인스턴스 메소드 호출을 사용하여 세트를 반복하고 싶었습니다. 세트의 길이와 지금까지 계산 된 항목 수를 알았으므로 효과적으로 hasNext
방법을 가졌습니다 .
내 코드의 간단한 버전 :
class Iterator:
# s is a string, say
def __init__(self, s):
self.s = set(list(s))
self.done = False
self.iter = iter(s)
self.charCount = 0
def next(self):
if self.done:
return None
self.char = next(self.iter)
self.charCount += 1
self.done = (self.charCount < len(self.s))
return self.char
def hasMore(self):
return not self.done
물론 예제는 장난감이지만 아이디어를 얻습니다. 생성기 등과 같이 iterable의 길이를 얻을 수있는 방법이없는 경우에는 작동하지 않습니다.