저는 이터레이터를 한동안 작성 해왔고, 나는 그것을 이해했다고 생각했습니다. 그러나 나는 오늘 밤에 어떤 이슈로 고심하고 있었고, 그걸 가지고 노는 것이 많을수록 내가 더 혼란스러워졌습니다.반복기 프로토콜. 어둠의 마법인가?
반복기의 경우 __iter__
및 next
(또는 __next__
)을 구현해야한다고 생각했습니다. 그리고 처음 반복기를 반복 할 때 __iter__
메서드가 호출 될 것이고 next
은 StopIteration
이 호출 될 때까지 호출됩니다.
나는 출력은 2 4 6
입니다
class Iter(object):
def __iter__(self):
return iter([2, 4, 6])
def next(self):
for y in [1, 2, 3]:
return y
iterable = Iter()
for x in iterable:
print(x)
불구하고이 코드를 실행합니다. 따라서 __iter__
이 호출되고 있지만 next
은 호출되지 않습니다. 그건 내가 찾은 문서와 일치하는 것 같습니다 here. 그러나 그때 내 마음 속에는 더 많은 질문이 제기됩니다.
next
구현이 아닌 컨테이너 유형과 반복기의 차이점은 무엇입니까? 어떻게 내 수업이 어떤 방식으로 취급 될지 미리 알 수 있습니까? 그리고 가장 중요한 것은 for x in Iter()
을 사용할 때 next
메서드가 호출되는 클래스를 작성하려면 어떻게해야합니까?
나는 돌아갈 것이라고 생각한다. 그래서 모든 반복자는 반복자이지만 모든 반복자가 반복자는 아닙니다. 그리고 iterable을 반복 할 때, 나는 iter 메소드가 리턴하는 것이 무엇이든지 반복하고있다. 반복기 또는 생성기 중 어떤 것이 될 수 있습니까? –
수정. 모든 반복자는 반복 가능합니다. 모든 iterables가 iterator는 아닙니다 (예를 들어, 목록은 반복 가능하지만'next'를 구현하지 않기 때문에 iterator가 아닙니다).객체에 대한 반복은 객체에서'iter()'를 호출하여 반환되는 객체에 대해 수행됩니다. 그것은 반드시 반복자를 반환해야합니다 (생성자는 반복자 유형입니다). – wim
고맙습니다. 나는 밤의 시작에 그 모든 것을 알고 있다고 생각하지만 밤의 시작에 대해서도 생각했다. 그러나 또한 매우 잘못된 몇 가지 다른 것들을 생각했다. –