iterable는 member를 하나씩 차례로 반환 가능한 object를 의미한다.
iterable의 예로는 sequence type인 list,str,tuple이 대표적이다.
for i in range(5): print i --- 0 1 2 3 4
당연하게 사용했던 위와 같은 for 문도 사실 range()로 생성된 list가 iterable하기 때문에 순차적으로 member들을 불러서 사용이 가능했던 것이다.
non-sequence type인 dict나 file도 iterable 하다고 할 수 있다.
dict 또한 for 문을 이용해 순차적으로 접근이 가능하다.
>> x = {'a':1, 'b':2, 'c':3} >> >> for i in x: print(i) a b c
또한 iter() 나 getitem() 메소드로 정의된 class는 모두 iterable 하다고 할 수 있다.
iterable 은 for loop 말고도 zip(), map()과 같이 sequence 한 특징을 필요로 하는 작업에 유용하게 사용된다.
zip() 이나 map() 함수의 경우 iterable을 argument로 받는 것으로 정의되어 있다.
iterator는 next() 메소드로 데이터를 순차적으로 호출 가능한 object이다. 만약 next()로
다음 데이터를 불러올 수 없을 경우(가장 마지막 데이터인 경우) StopIteration exception을 발생시킨다.
그렇다면 iterable한 object들은 iterator일까?
결론부터 말하자면, iterable 이라고 해서 반드시 iterator인 것은 아니다.
>> x = [1,2,3] >> next(x) Traceback (most recent call last) file"<stdin>", line 1, in <module> TypeError: list object is not an iterator
iterator 가 아니라는 에러 메시지가 출력되는것을 확인할 수 있다.
list 는 iterable 이지만, 위와 같이 next() 메소드로 호출해도 동작하지 않는다.
만약, iterable 을 iterator로 변환하고 싶다면, iter() 라는 built-in function을 사용하면 된다.
>> x = [1,2,3] >> type(x) <type 'list'> >> y = iter(x) >> type(y) <type 'listiterator'>
위와 같이 iter() 함수를 사용하여 list를 listiterator 타입으로 변경할 수 있다.
>> next(y) 1 >> next(y) 2 >> next(y) 3 >> next(y) Traceback (most recent call last): File "<stdin>",line 1, in <module> StopIteration
이제 next()를 이용해 list의 정보를 하나씩 꺼낼 수 있다. 그리고 마지막 정보를 호출 한 이후에 next()를 호출하면 StopIteration 이라는 exception 이 발생됨을 볼 수 있다.
하지만, 우리가 list 나 tuple같은 iterable한 object를 사용할 때 굳이 iter() 함수를 사용하지 않아도 for 문을 이용하여 순차적으로 접근이 가능했다.
이것은 for 문으로 looping 하는 동안, python 내부에서 임시로 list를 iterator로 자동 변환해주었기 때문이다!