본문 바로가기

About/Python

[Python] Iterable & Iterator

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에 대하여 알아보았다. 

 

참고