궁금증 연구소

안녕하세요. 궁금증연구소 입니다.

오늘 포스팅 주제는 "iterable 객체와 iterator 구분" 입니다.

 

파이썬에서 iter함수가 반환하는 객체를 iterator 객체라고 하고 iterator 객체를 얻을수 있는 리스트,튜플 같은 객체를 iterable객체라고 합니다.

 

Iterable 객체  -- iter 함수에 인자로 전달 가능한 객체

Iterator 객체 -- iter 함수가 생성해서 반환하는 객체

 

이렇게만 말하면 뭔개소리지 싶다..

문자열 iterator

예를 들어 r3라는 변수에 apple이라는 문자열을 담고 r3 를 iter함수에 인수로 넣어보면 이터레이터가 16진수 메모리 주소에 형성되는 것을 볼 수 있다. 이 이터레이터의 이름은 str_iterator 이다.

리스트, 튜플 이터레이터

 

마찬가지로 리스트나 튜플 또한 iter 함수의 인자로 넣어보면 각각 list와 tuple 이터레이터가 만들어 지는 것을 알수 있다. 

 

 

정수는 이터레이터가 아니다.

단일 정수값을 iter 함수에 넣어보면 정수객체는 이터레이터가 아니라는 타입에러를 볼 수 있다.

 

이터레이터 객체의 용도

이렇게 이터레이터를 만드는 이유는 이터레이터가 iter 함수에 인자로 넣었던 객체의 값들에 접근할 수 있는 도구이기 때문이다. 접근은 next라는 함수를 통해 할 수 있다.

 

next 함수를 통한 값에 접근

앞에서 만든 r3="apple" 이라는 문자열로 이터레이터 객체를 만들어 그 값을 next 함수의 인수로 넣으면 apple 문자열의 값을 차례로 하나씩 불러와 출력해 준다. 값이 모두 불러와지면 StopIteration 에러가 발생하면서 중단된다.

만약 다시 apple 값을 불러오려면 다시 객체를 만들면 된다. 

 

내부적으로는 좀더 복잡한 과정을 거치게 되는데, 파이썬 인터프리터의 스페셜메소드를 이용하게 된다.

 

1)리스트의 __iter__ 메소드 호출로 iterator 객체를 얻는다.

2)iterator 객체의 __next__ 메소드 호출을 통해서 값을 하나씩 얻게 된다.

 

 

어떤 객체가 iterable한 객체인지 좀 더 빨리 알아보는 방법은 아래와 같다.

 

hasattr

hasattr() 함수의 첫번째 인수로 확인하고 싶은 객체, 두번째 인수로 '__iter__' 를 입력하면 iterable한 객체인지 확인할 수 있다.

 

자주쓰는 for문의 경우에도 in 다음에는 iterable 객체가 와야 한다. for문의 내부는 다음과 같이 iterator 를 생성해 next 함수의 인수로 넣어 stopiteration을 만날때까지 호출하는 형식으로 되어 있다.

 

for i in [1,2,3] :
	print(i, end = ' ')
	
ir = iter([1,2,3])

while True :

	try :
    	 i = next(ir)
         print(i, end = ' ')
    except StropIteration:
    	 break

 

 

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading