YongWook's Notes

<파이썬> yield from 본문

-software/python

<파이썬> yield from

글로벌한량 2018. 12. 7. 18:13

Python : yield from

앞선 포스트에서 알아보았던 generator & yield에서 한걸음 더 나아가, 이번 포스트에서는 yield from 이라는 파이썬 문법을 알아보려고 한다. yield from은 python 3.3 이상 버전에서 사용가능한 문법이다.

이번 포스트 또한 Simeon Visser’s blog의 내용을 참조하여 작성하였음을 미리 알린다.

사실 기초 프로그래밍을 공부하는 학생들은 generator를 다룰 일이 자주 없지만, 실제 프로그래밍에서는 심심찮게 등장하기 때문에 개념을 숙지해놓으면 분명 도움이 될 것이다.

yield from의 필요성

def generator():
	for i in range(10):		
		yield i
	for j in range(10, 20):
		yield j

위와 같이 yield가 여러번으로 나뉜 코드를 작성하게 된 경우라고 가정해보자. 이 generator()는 순서대로 0부터 19까지의 수를 반환하도록 설계되어 있다. 그런데 만약, yield iyield j부분의 코드를 재사용하고 싶다면 우리는 이 코드를 다음과 같이 재작성할 수 있다.

def generator2():
	for i in range(10):
		yield i

def generator3():
	for j in range(10,20):
		yield j

def generator():  
	for i in generator2(): 
		yield i  
	for j in generator3():  
		yield j

코드를 재사용할 수 있게 작성하였으나 명시적이지 않다. 오히려 의도를 파악하기 힘들어 혼란을 초래할 수 있다. 따라서 보다 명시적으로 표현할 수 있는 문법에 대한 수요가 생겼다. 이것이 yield from이다.

yield from의 사용법

위의 코드에서 yield from을 사용하면 generator()부분을 조금 더 간결하게 만들 수 있다.

def generator():
	yield from generator2()
	yield from generator3()

이 코드는 for문을 사용하지 않고 generator의 다음 iteration을 수행한 후, 그 값을 바로 yield하므로서 가독성을 높이는 효과를 준다.

yield from이 지원되지 않던 때에 위와 같은 코드를 작성하려면, itertools 모듈을 통해 chain이라는 함수를 사용하여야만 했다. python 3.3 이상 버전을 이용하는 코드에서는 꼭 yield from을 사용하도록 하자.

다음 코드는 python 3.3 미만 버전에서 itertools.chain을 이용하여 두개의 generator를 묶어 사용하는 예시이다.

from itertools import chain

def generator():
	for v in chain(generator2(), generator3()):
		yield v


Comments