본문 바로가기

파이썬/사용법

[python] iterator 와 iterable 정확히 알고 계시나요?

안녕하세요!

이번 글에서는 파이썬에서 iterator와 iterable에 대해서 알아보려고 합니다.

 

1) iterable

2) iterator

3) iterable과 iterator의 공통점

4) iterable과 iterator 의 차이점

5) for 문에서 iterable 객체 사용 시 일어나는 동작

 

순으로 알아보겠습니다.

 


1) iterable

반복 가능한 객체를 의미합니다.

종류에는 list, tuple,set,dictionary,range,str 이 있습니다.

 

파이썬에서 object가 iterable 하다 라는 의미는

iterable 한 객체를 iterator로 변경시키는 built-in function인 iter()의 인자로 넘겨줄 수 있는 객체를 의미합니다.

 

자 다시 한번 정리하겠습니다.

 

파이썬에서 iterable 한 객체는 iter(iterable object)  iter 함수의 인자로 사용할 수 있는 객체를 의미합니다.

myset = {5,4,6,3,1,2} 						# 집합 자료형 생성
mydict  = {1:1,2:2,3:3,4:4} 					# 딕셔너리 자료형 생성
mylist = [1,2,3,4,5,6] 						# 리스트 자료형 생성
mytuple = (1,2,3,4,5,6)						# 튜플 자료형 생성
mystr = "12345"							# 문자열 자료형 생성
myrange = range(1,10)						# range 자료형 생성?


myset_iter = iter(myset)				# iterator 생성
mydict_iter = iter(mydict)
mylist_iter = iter(mylist)
mytuple_iter = iter(mytuple)
mystr_iter = iter(mystr)
myrange_iter = iter(myrange)

print(f'{myset} {type(myset_iter)}')
print(f'{mydict} {type(mydict_iter)}')
print(f'{mylist} {type(mylist_iter)}')
print(f'{mytuple} {type(mytuple_iter)}')
print(f'{mystr} {type(mystr_iter)}')
print(f'{myrange} {type(myrange_iter)}')

# 
# range(1, 10) <class 'range'>
# {1, 2, 3, 4, 5, 6} <class 'set_iterator'>
# {1: 1, 2: 2, 3: 3, 4: 4} <class 'dict_keyiterator'>
# [1, 2, 3, 4, 5, 6] <class 'list_iterator'>
# (1, 2, 3, 4, 5, 6) <class 'tuple_iterator'>
# 12345 <class 'str_ascii_iterator'>
# range(1, 10) <class 'range_iterator'>

\iter() 함수의 인자로 iterable한 객체를 사용하면 iterator로 리턴합니다.

타입은 한번 보시면서 파악만 해두시길 바랍니다.

 

 

 

2) iterator

반복자를 의미합니다.

iterator는 next() 함수의 객체로 사용하여 객체를 하나씩 반환할 수 있습니다.

 

자 다시 한번 정리 하겠습니다.

iterator는 next() 함수의 인자로 객체를 사용할 수 있는 객체를 의미합니다.

 

mylist = [1,2,3,4,5,6] # 리스트는 iterable 한 객체 

mylist_iter = iter(mylist) # iterable 하면 iter()의 인자로 전달가능.
# iterator 생성

print(next(mylist_iter)) # 첫번째 시퀀스 부터 리턴 
print(next(mylist_iter)) 
print(next(mylist_iter))
print(next(mylist_iter))
print(next(mylist_iter))
print(next(mylist_iter))
print(next(mylist_iter))

# 1
# 2
# 3
# 4
# 5
# 6


# StopIteration

next는 iterator에서 하나씩 리턴합니다.

파이썬에서 이터레이터를 사용할 때는 next() 함수를 호출하면 이터레이터는 다음 값을 반환합니다.

계속 반환하다가 더 이상 반환할 요소가 없으면 StopIteration Exception을 raise 합니다.

 

 

3) iterable과 iterator의 공통점

iter() 함수의 인자로 전달 가능합니다.

myset = {5,4,6,3,1,2}
myset_iter = iter(myset)

print(iter(myset),iter(myset_iter))

# <set_iterator object at 0x0000021ECAEA7F00> <set_iterator object at 0x0000021ECAEA7E00>

보시다시피 둘 다 iter의 인자로 사용가능합니다.

 

 

4) iterable과 iterator의 차이점

iterable은 메서드로 __next__()가 없다.

iterator는 메서드로 __next__()가 있다.

 

 

5) for 문에서 iterable 객체 사용 시 일어나는 동작

5-1) container 객체에서 __iter__를 호출해서 다시 담습니다.

5-2) next() 무한 반복 

5-3) StopIteration Exception raise 됩니다.

 

mylist = [1,2,3,4,5,6]

mylist = mylist.__iter__()
mylist = iter(mylist)

while(1):
    try:
        print(mylist.__next__())
    except StopIteration as e:
        break
        
# 1
# 2
# 3
# 4
# 5
# 6

다시 한번 정리하겠습니다

 

iter 씌운다(iterator로 만든다)

next() 무한 반복한다.

stopiteration Exception raise 하고 끝낸다.

 

while로 한번 작성해 보았습니다.

 

정리)

1) iterable

  __iter__ ()를 method로 가진 객체

 

2) iterator

  __iter__()를 method로 가진 객체

  __next__()를 method로 가진 객체

 

3) iterable과 iterator의 공통점

  __iter__()를 method로 가진 객체

 

4) iterable과 iterator의 차이점

  __next__()를 method의 유무

 

5) for 문에서 iterable 객체 사용 시 일어나는 동작

  5-1) __iter__() 호출

  5-2) __next__() 끝까지 반복

  5-3) StopIteration Exception raise 후 반복문 종료

 

저는 개인적으로 for문을 pt 선생님에 비유한 코딩빌런님의 iter() 설명을 너무 잘 보았습니다.

제 글을 보고 이해가 안 되신다면 봐주시면 감사하겠습니다.

https://www.youtube.com/watch?v=AXxfyrICB1Q 

문제가 될 시에 삭제 조치 하도록 하겠습니다.

 

마치면서)

파이썬 공식 문서에서 파이썬 iterator, iterable로 예제를 찾아보시면 더욱 자세한 정보를 얻을 수 있습니다. 

다음 글에서도 유용한 파이썬 팁과 기능을 소개하도록 하겠습니다

감사합니다.