iter 함수
개발을 하다 보면 하나 이상의 값을 저장하고, 저장된 값들을 불러오는 일은 매우 흔하고 중요하다.
Python에서는 다음과 같이 for loop을 기반으로 이러한 작업을 수행한다.
numbers = [1, 2, 3, 4]
for i in numbers: #numbers에 저장된 내용을 하나씩 출력
print(i, end = ' ')
위의 방법만으로도 대부분의 작업을 수행할 수 있지만, 조금 더 유연한 방법이 있다.
numbers = [1, 2, 3, 4]
ir = iter(numbers) #iterator 객체를 얻는 방법
print(next(ir)) # next(ir) : iterator 객체를 통해 값을 하나 가져옴(첫번째 값)
print(next(ir)) # 두 번째 값 반환 후 출력
print(next(ir)) # 세 번째 값 반환 후 출력
print(next(ir)) # 네 번째 값 반환 후 출력
실행 결과
위의 예시에서 iter함수에 리스트를 전달하여 'iterator 객체' 라는 것을 생성하였다
ir = iter(numbers)
그러면 numbers에 접근하는 'iterator 객체'라는 것을 생성하여 ir에 저장한다. 이어서 이 객체를 전달하며 다음과 같이 next 함수를 호출하여 리스트에 저장된 값을 하나씩 얻을 수 있다.
next(ir)
리스트의 마지막 값을 얻었음에도 다시 next 함수를 호출하면 다음과 같이 StopIteration 예외가 발생한다.
Iterable 객체와 Iterator 객체의 구분
- Iter 함수가 반환하는 객체를 가리켜 'iterator 객체' 라고 하며 iterator를 얻을 수 있는 리스트 등과 같은 객체를 가리켜 'iterable 객체'라 한다.
- iterable 객체에는 list, dict, set, str, bytes, tuple, range 등이 존재한다.
- iterator 객체와 iterable 객체는 다음과 같이 정리할 수도 있다.
- "iterable 객체를 대상으로 iter 함수를 호출하여 iterator 객체를 만든다."
- "iteartor 객체를 생성할 수 있는 대상이 되는 것이 iterator 객체이다."
iterable, iteartor의 특징
iter()
- iter 함수 호출은 파이썬 인터프리터에 의해 __iter__메소드 호출로 이어진다.
ir = iter(numbers) -> ir = numbers.__iter()__
- next 함수 호출은 __next__ 메소드 호출로 이어진다.
next(ir) -> ir.__next__()
iterable 객체 종류와 확인 방법
- 튜플 및 문자열을 대상으로도 iterator 객체를 얻을 수 있다.
s = "Hello Jimmy!"
ir = iter(s)
print(next(ir)) #H 출력
- dir함수를 통하여 __ iter__ 메소드가 존재하는지 확인 가능하며, hasattr 함수 호출을 통해서 __iter__함수가 있는지 직접 물어볼 수도 있다.
print(dir([1,2]))
dir(리스트) 실행결과
print(hasattr([1,2],'__iter__'))
hasattr(리스트,'__iter__')실행결과
기타
- iterator 객체를 iter()의 인자로 두면 전달된 iterator 객체를 그대로 전달한다.
ir1 = iter([1,2,3])
ir2 = iter(ir1) #iterator 객체를 통하여 iterator 객체를 생성
print(id(ir1))
print(id(ir2))
실행결과
iterator 객체와 새로 생성한 iterator객체의 id가 같은 것을 확인할 수 있다.
Python의 iterable 객체와 iterator에 대하여 알아보았다.
참고
'About > Python' 카테고리의 다른 글
[Python] 프로퍼티(Property)-getter, setter, deleter (0) | 2021.09.25 |
---|---|
[Python] 함수 실행 시간 측정 (Python decorator 활용) (0) | 2021.07.19 |
[Python] Counter (단어 개수 세기) (2) | 2020.12.30 |
[Python] Collections - defaultdict (단어 개수 세기) (0) | 2020.12.27 |
[Python] Collections - OrderedDict (0) | 2020.12.27 |