안녕하세요!
이번 글에서는 파이썬에서 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로 예제를 찾아보시면 더욱 자세한 정보를 얻을 수 있습니다.
다음 글에서도 유용한 파이썬 팁과 기능을 소개하도록 하겠습니다
감사합니다.
'파이썬 > 사용법' 카테고리의 다른 글
[python] 파이썬 lambda를 활용하기 (0) | 2023.08.03 |
---|---|
[python] 파이썬 lambda로 간결한 함수 작성하기 (0) | 2023.08.02 |
[python] 파이썬 함수 가독성 극대화하기 (0) | 2023.07.31 |
[python] 함수 파라미터 설정하는 방법 정리 [2] (0) | 2023.07.30 |
[python] 함수 파라미터 설정하는 방법 정리 [1] (0) | 2023.07.30 |