[Python] Generator, yield



Python의 generator라는 것은 간단하게 말하면 iterator를 생성해주는 함수입니다. Python에서 iterator는 next()메소드를 이용해 데이터에 순차적으로 접근이 가능한 오브젝트죠. 


generator는 일반적인 함수와 비슷하지만 함수 안에 yield란 키워드를 작성하여 next()가 호출될 때마다 다음 데이터의 값을 반환한다는 것이 가장 큰 차이점입니다.


 
def gen(n):
	i = 0
	test = ['a', 'b', 'c']
	while i < n:
		print("This turn:", test[i])
		yield test[i]
		i = (i + 1)%3

sample = gen(6)

for i in range(6):
	print(next(sample))
위의 코드를 보면 gen라는 함수를 정의했습니다. 이 함수는 임의의 정수를 받아 그 수에 매칭되는 문자들을 출력해주는 함수입니다. generator의 특징은 yield 키워드를 이용하여 다음 데이터를 순차적으로 반환한다는 데에 있습니다.

만일 일반적인 함수인 경우인 경우 return을 써서 결과값을 반환하면 함수 자체가 종료되고 메모리 상에서 클리어 되죠. 하지만 generator는 일반적인 경우처럼 종료되는 것이 아니라 그 상태를 그대로 유지합니다. 함수 안에 사용된 변수와 현재 instruction pointer의 함수 내부 정보가 그대로 메모리에 유지되는 것이죠.

출력

This turn: a
a
This turn: b
b
This turn: c
c
This turn: a
a
This turn: b
b
This turn: c
c

그리고 이 generator를 보다 간편하게 쓸 수 있도록 Python에서는 generator expression을 제공합니다. 

 
a = [i for i in range(10) if i%2]
print(a)
b = (i for i in range(10) if i%2)
print(b)
for i in range(5):
	print(next(b))

출력

[1, 3, 5, 7, 9]
<generator object="" <genexpr="">
 at 0x02C5F510>
1
3
5
7
9

generator 함수를 써서 얻을 수 있는 이점은 꼭 필요한 순간에 순차적으로 데이터에 접근할 수 있다는 것입니다. 만일 10GB용량의 텍스트파일을 가지고 프로그래밍을 한다고 가정합시다. 이 텍스트파일들을 메모리에 다 올려놓고 작업을 하는 것은 아주 부담스러운 일이죠. 하지만 순차적으로 필요한 텍스트 데이터를 가져온다고 하면 메모리를 훨씬 더 효율적으로 사용할 수 있겠죠. generator는 이같은 경우 적합하게 사용됩니다.


정리하면 

1. generator는 순차적으로 데이터에 접근하게 하는 함수 yield 키워드를 써서 순차적으로 값을 반환

2. 일반 함수는 값이 반환되면 메모리에서 클리어 되지만 generator는 그대로 메모리에 유지

3. generator를 사용함으로서 얻을 수 있는 이점은 

3-1 메모리 효율성

3-2 프로그래밍의 편의성


** 오류가 있을 시 댓글로 관련 사항을 적어주시면 확인해서 바로 수정하도록 하겠습니다. **

참조 : http://bluese05.tistory.com/56


'Python' 카테고리의 다른 글

[Python] PyCharm에서 패키지 설치하기  (0) 2018.11.14
[Python] 데코레이터(Decorator)  (0) 2017.11.18
[Python] 클로저(Closure)  (0) 2017.11.18
[Python] lambda  (0) 2017.04.19
[Python] Generator, yield  (0) 2017.04.05
[Python] print 함수 사용시 소수점 자리 찍기  (0) 2017.04.05

이 글을 공유하기

댓글(0)

Designed by JB FACTORY