Python docs와 여러 블로그를 참고해서 각 용어를 정의해 보았다.
📒 Iterable (이터러블)
📑 iterable 정의
한 번에 하나씩 멤버를 반환할 수 있는 객체입니다. iterable의 예로는 모든 시퀀스 유형과 일부 비시퀀스 유형이 있습니다.
Iterable은 for 루프와 시퀀스가 필요한 다른 많은 위치(zip( ), map( ), …)에서 사용할 수 있습니다. iterable 객체가 내장 함수 iter( )에 인수로 전달되면 객체에 대한 iterator를 반환합니다. 이 반복자는 값 집합을 한 번만 전달하는 데 적합합니다. iterable을 사용할 때 일반적으로 iter( )를 호출하거나 iterator 객체를 직접 처리할 필요가 없습니다. for 문은 자동으로 이를 수행하여 루프 기간 동안 반복자를 보유할 이름 없는 임시 변수를 생성합니다.
📑 iterable 예
- 시퀀스 유형 : list, str, tuple 등
- 비 시퀀스 유형 : dict 등
📑 내가 이해한 iterable
for 루프를 통해서 멤버를 뽑을 수 있는 자료구조를 iterable한 객체로 보는 거 같다. zip( )이나 map( )과 같은 순서대로 처리할 입력이 필요한 곳에도 사용할 수 있으며 우리가 만든 class도 조건을 충족한다면 iterable 객체가 될 수 있다.
📒 Iterator (이터레이터)
📑 Iterator 정의
데이터 스트림을 나타내는 객체입니다. Iterator의 __next__( ) 메서드에 대한 반복적인 호출은 스트림에서 연속적인 항목을 반환합니다. 더 이상 사용할 수 있는 데이터가 없으면 대신 StopIteration 예외가 발생합니다. 이 시점에서 iterator 객체는 소진되고 __next__( ) 메서드에 대한 추가 호출은 StopIteration을 다시 발생시킵니다. Iterator는 반복자 객체 자체를 반환하는 __iter__( ) 메서드가 필요하므로 모든 Iterator도 반복 가능하고 다른 반복 가능 항목이 허용되는 대부분의 장소에서 사용할 수 있습니다. 한 가지 주목할만한 예외는 다중 반복 패스를 시도하는 코드입니다. 컨테이너 객체(예: 목록)는 iter( ) 함수에 전달하거나 for 루프에서 사용할 때마다 새로운 Iterator를 생성합니다. 반복기로 이것을 시도하면 이전 반복 단계에서 사용된 것과 동일한 소진된 반복기 객체를 반환하여 빈 컨테이너처럼 보이게 합니다. 자세한 내용은 반복자 유형에서 찾을 수 있습니다.
📑 내가 이해한 Iterator
iterator은 iter( )함수를 통해서 만들어지는 객체(object)이다. iterator는 __next__( )나 내장 함수인 next( )의 입력으로 들어가 호출하여 다음 원소(element)를 순차적으로 반환한다.
iterator가 다음 원소를 계속 반환하다가, 끝에 다달아 더 이상 원소가 없을 경우에는 예외문인 StopIteration이 발생하게 된다.
이 과정을 순서대로 정리하면,
1. A = [1,2] : iterable 객체
2. iter(A) : iterable 객체를 인자로 받아서 iterator 객체를 반환(B)
3. B = iterator 객체
4. next(B) >>> 1
5. next(B) >>> 2
6. next(B) >>> StopIteration
🎈 깨알 상식 1
for문과 iterable 객체를 사용했는데 iter( ), next( )를 보지 못한 이유는 다음과 같다.
파이썬이 for문 + iterable 객체를 만나게 되면 내부적으로 iter( )함수를 호출해 iterator를 생성하고, 생성된 iterator가 next( )를 호출하는 과정이 반복되며 데이터를 가져올 수 있다. 그리고 모든 원소를 가져온 뒤에는 StopIteration이 발생해서 for문이 종료된다.
이해를 돕기 위한 코드
for element in iterable_object:
print(element)
파이썬에서 내부적으로 동작하는 코드 느낌은 이렇다.
# iter() 함수를 호출해, iterator 를 생성하고,
iterator_object = iter(iterable_object)
while True:
# next() 함수를 호출해, element 를 받아옵니다.
try:
element = next(iterator_object)
print(element)
# element 가 없을 시, StopIteration Exception 발생
except: StopIteration:
break
(직접 확인한 건 아니고 다른 블로그 코드를 참조했다.(여기) 기회가 된다면 실제로 for, if, while 등 자주 쓰는 문법이 어떻게 동작하고 있는지 확인해봐야겠다.)
🎈 깨알 상식 2
iterable 객체는 iterator 객체와 다르다.
실제로 list를 바로 next( )의 인자로 호출하면 다음과 같은 에러가 발생한다.그래서 앞에 설명했듯 iter( )함수로 type 전환을 해줘서 사용하는데 예제 코드를 확인해서 itorator 타입과 어떻게 동작하는지 확인해보자.
a = [1,2,3,4,] # 리스트
a2 = (1,2,3,4) # 튜플
b = iter(a) # 리스트 이터레이터
b2 = iter(a2) # 튜플 이터레이터
print(type(b)) # <class 'list_iterator'>
print(next(b)) # 1
print(next(b)) # 2
print("-----")
print(type(b2)) # <class 'tuple_iterator'>
print(next(b2)) # 1
print(next(b2)) # 2
🎈 참고자료
https://docs.python.org/3/glossary.html
https://emjayahn.github.io/2019/07/15/iterator-generator/
https://bluese05.tistory.com/55
'코딩 > Python' 카테고리의 다른 글
[Python/파이썬] 문자열 메서드 split 함수 정리 (0) | 2023.10.06 |
---|---|
[Python] Mutable, Immutable한 자료구조에 대해 공부해보자 (0) | 2022.06.09 |
[Python] 내장함수 globals() 활용하기 (0) | 2022.04.24 |