Python

Python - iterator , generator

baecode 2022. 5. 16. 20:42
반응형

iterable

iterable 객체란 반복 가능한 객체를 뜻하며

iterable 객체에는 list, set, dict, tuple, str, bytes, range 가 있다

 

iterator

 

iterator 객체란 값을 차례대로 꺼낼 수 있는 객체를 뜻하며

iterable한 객체를 내장함수 또는 iterable객체의 메소드로 객체를 생성할 수 있습니다

파이썬 내장함수 iter()를 사용해 iterator 객체를 만들 수 있습니다

또한 next()를 사용해서 값을 차례로 꺼낼 수 있습니다

numbers = [1,2,3,4,5]
numbers_iter = iter(numbers)

next(numbers_iter)			#1
next(numbers_iter)			#2
next(numbers_iter)			#3
next(numbers_iter)			#4
next(numbers_iter)			#5

#6번째 실행에서 StopIteration 이라는 예외가 발생

next(numbers_iter)
#
Traceback (most recent call last):
  line 11, in <module>
StopIteration

 

 

generator

generator란 iterator를 생성해주는 함수이면서 내부에 yield 키워드를 사용한다

yield 를 사용 할때는 일반적인 함수에서 return 하는 것과 달리

 yield 를 만날 경우, 해당 함수는 그 상태로 정지 되며, 반환 값을 next() 를 호출한 쪽으로 전달 하게 된다. 이후 해당 함수는 일반적인 경우 처럼 종료되는 것이 아니라 그 상태로 유지되게 된다. 즉, 함수에서 사용된 local 변수나 instruction pointer 등과 같은 함수 내부에서 사용된 데이터들이 메모리에 그대로 유지가 된다.

 

또 , generator를 사용하는 이유는 효율적인 메모리 사용량에 있다

 

import sys

>>> sys.getsizeof( [i for i in xrange(100) if i % 2] )    # list
536

# Generator Expression 으로 () 를 사용하여 generator 객체를 만들 수 있다

>>> sys.getsizeof( (i for i in xrange(100) if i % 2) )    # generator
80

보는 것과 같이 리스트로 만든 객체와 제너레이터로 만든 객체는 메모리 사용량에 큰 차이를 보인다

list에 있는 모든 데이터를 메모리에 저장하는 list 와 달리 generator는 next를 이용하여 값을 가져올때마다 메모리에 저장하는 방식이다

 

반응형