Python/2.7 information

yield from, generator(yield) vs coroutine (python 3)

qkqhxla1 2017. 4. 26. 20:03

1. 파이썬에서 제너레이터로 yield를 쓸수 있다. 하지만 3.3부터 yield from 이라는 구문도 생겼다. 간단하게 아래 예제처럼 여러개의 제너레이터를 리팩토링해줄수 있다고 한다.

출처 : http://simeonvisser.com/posts/python-3-using-yield-from-in-generators-part-1.html

# -*- coding: utf-8 -*-
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

for n in generator():
	print (n)

를 yield from을 쓰면 generator함수를

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

처럼 바꿔줄수 있다고 한다. 간단하게 리팩토링이 되었다.



2. generator vs coroutine.

사실 둘의 차이가 뭔지 몰랐다. 똑같은건줄 알았는데 우연히 오늘 이것저것 찾다가 비교 자료를 찾게 되었다.

스택오버플로우 : http://stackoverflow.com/questions/715758/coroutine-vs-continuation-vs-generator


The difference between a coroutine and generator is that a coroutine can accept arguments after it's been initially called, whereas a generator can't.
코루틴과 제너레이터의 차이점은 코루틴은 인자가 초기화된 후에 재접근이 가능하지만 제너레이터는 불가능하다는 점이다.

코드 예제.
generator.
def generator():
	for i in range(100):
		yield i

for g in generator():
	print (g)

yield i 는 return과 같이 값을 리턴한다. 하지만 리턴한 후에 종료되는 일반 함수와는 달리 실행흐름이 다시 yield다음으로 돌아온다. 그러므로 yield i 로 i값이 리턴되더라도 그 다음의 실행흐름으로 가서 1,2,3,4,~99까지 실행된다.


coroutines.

def coro():
    a = yield 1
    print('after first yield, a = {}'.format(a))
    yield a
    print('finish coro')

c = coro()
value = next(c)
print('first yield =',value)
print('last yield =',c.send(value + 1))

1. c에 coco()함수를 할당.


2. value에 c에서 yield된 값을 할당.(함수 내부의 a = yield 1 에서 yield된 1을 가져옴.)


3. first yield를 출력.


4. c.send() 로 coro()함수로 받은 값을 다시 보냄. value + 1을 보냈으므로 2가 보내지며,

a = yield 1부분에서 a = 2로 할당되고 두줄 아래인 yield a로 실행흐름이 돌아감. 


5. yield a로 2가 yield되고, 이게 c.send(value + 1)의 결과값이 된다.


6. 그래서 last yield = 2가 출력된다.

'Python > 2.7 information' 카테고리의 다른 글

파이썬 정규식 한글.  (0) 2017.05.12
비동기 처리 관련.(python 3)  (0) 2017.04.30
mongo db  (0) 2017.04.19
로그 찍기.  (0) 2017.03.30
유닛테스트.  (0) 2017.03.26