[Python] iterable과 iterator의 의미

최창현·2022년 2월 3일
0
post-thumbnail

iterable(이터러블)

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(이터레이터)

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로 자동 변환해주었기 때문이다!

profile
chch_oi

0개의 댓글