Iterable
반복가능한 객체. 내부요소(member)를 하나씩 리턴할 수 있는 객체를 Iterable하다라고함. for문을 순회할 수 있는객체를 iterable하다. 대표적으로 시퀀스타입과 컬렉션 타입.
Iterator
값을 차례대로 꺼낼 수 있는 객체. next() 함수 호출시 계속 그 다음 값을 반환하는 객체.
iterator은 iterable한 객체를 내장함수 또는 iterable 객체의 메소드로 생성할 수 있음.
# iterable한 리스트는 iterator일까
list = [1, 2, 3]
next(list)
TypeError: 'list' object is not an iterator
반복가능하다고 해서 iterator는 아니다. iter()함수를 이용하여 itertor 만들기.
iter()와 next()
iter()는 파이썬의 내장함수로, iterable객체를 받아 iterator를 반환함.
내부적으로 iter()함수는 객체의 __iter__() 메소드를 호출함
list = [1, 2, 3]
iter_list = iter(list)
print(type(iter_list))
<class 'list_iterator'>
리스트가 iterator가 되었으므로 next()함수를 호출하면
print(next(iter_list))
print(next(iter_list))
print(next(iter_list))
print(next(iter_list))
1
2
3
StopIteration # 에러
__iter__와 __next__
__iter__()메소드는 클래스에서 iterator 프로토콜을 구현하는데 사용되는 특수매소드/매직메소드.
객체 자신이 iterator인 경우 자기자신을, 그렇지 않으면 iterator 객체를 반환함.
__iter__()는 직접 호출되기보다는 파이썬의 iter()함수나 for문 등으로 호출됨. 클래스를 정의할때 __iter__() 메소드를 구현함으로써 해당 클래스의 인스턴스가 iterable되도록함.
class MyIterator:
def __init__(self, data):
self.data = data
self.position = 0
def __iter__(self):
return self # iterator로 자기자신을 반환.
def __next__(self):
if self.position >= len(self.data):
raise StopIteration
result = self.data[self.position]
self.position += 1
return result
if __name__ == "__main__":
item = MyIterator([1, 2, 3])
for i in item:
print(i)
1
2
3
for문과 Iterator
파이썬의 for문은 내부적으로 Iterator를 생성하여 동작함. __iter__메소드 이용.
stopiteration 예외가 발생하면 순회마침.
추가로 공부할것
iterator의 장점, 제너레이터, 이터레이터와 for문