https://dojang.io/mod/page/view.php?id=2414
40.3 yield from으로 값을 여러 번 바깥으로 전달하기
지금까지 yield로 값을 한 번씩 바깥으로 전달했습니다. 그래서 값을 여러 번 바깥으로 전달할 때는 for 또는 while 반복문으로 반복하면서 yield를 사용했습니다. 다음은 리스트의 1, 2, 3을 바깥으로 전달합니다.
generate_for_yield.py
def number_generator(): x = [1, 2, 3] for i in x: yield i for i in number_generator(): print(i)
실행 결과
1 2 3
이런 경우에는 매번 반복문을 사용하지 않고, yield from을 사용하면 됩니다. yield from에는 반복 가능한 객체, 이터레이터, 제너레이터 객체를 지정합니다(yield from은 파이썬 3.3 이상부터 사용 가능).
- yield from 반복가능한객체
- yield from 이터레이터
- yield from 제너레이터객체
그럼 yield from에 리스트를 지정해서 숫자 1, 2, 3을 바깥으로 전달해보겠습니다.
generator_yield_from_iterable.py
def number_generator(): x = [1, 2, 3] yield from x # 리스트에 들어있는 요소를 한 개씩 바깥으로 전달 for i in number_generator(): print(i)
실행 결과
1 2 3
yield from x와 같이 yield from에 리스트(반복 가능한 객체)를 지정했습니다. 이렇게 하면 리스트에 들어있는 요소를 한 개씩 바깥으로 전달합니다. 즉, yield from을 한 번 사용하여 값을 세 번 바깥으로 전달합니다. 따라서 next 함수(__next__ 메서드)를 세 번 호출할 수 있습니다.
>>> g = number_generator() >>> next(g) 1 >>> next(g) 2 >>> next(g) 3 >>> next(g) Traceback (most recent call last): File "<pyshell#105>", line 1, in <module> next(g) StopIteration
40.3.1 yield from에 제너레이터 객체 지정하기
이번에는 yield from에 제너레이터 객체를 지정해보겠습니다(이터레이터는 제너레이터와 동작이 같으므로 생략하겠습니다).
generator_yield_from_generator.py
def number_generator(stop): n = 0 while n < stop: yield n n += 1 def three_generator(): yield from number_generator(3) # 숫자를 세 번 바깥으로 전달 for i in three_generator(): print(i)
실행 결과
0 1 2
먼저 제너레이터 number_generator는 매개변수로 받은 숫자 직전까지 숫자를 만들어냅니다. 그리고 three_generator에서는 yield from number_generator(3)과 같이 yield from에 제너레이터 객체를 지정했습니다.
number_generator(3)은 숫자를 세 개를 만들어내므로 yield from number_generator(3)은 숫자를 세 번 바깥으로 전달합니다. 따라서 for 반복문에 three_generator()를 사용하면 숫자를 세 번 출력합니다(next 함수 또는 __next__ 메서드도 세 번 호출 가능).
이번 유닛에서는 제너레이터와 yield 사용 방법을 알아보았습니다. 이 부분은 파이썬에서도 고급 기능에 해당하는 부분이라 초보자들은 이해하기가 쉽지 않습니다. 그래서 지금 당장 yield가 이해되지 않는다고 해서 걱정할 필요가 없습니다. 나중에 프로그래밍에 익숙해지면 자연스럽게 익히게 됩니다.
리스트 표현식을 사용할 때 [ ](대괄호)를 사용했습니다. 같은 리스트 표현식을 ( )(괄호)로 묶으면 제너레이터 표현식이 됩니다. 리스트 표현식은 처음부터 리스트의 요소를 만들어내지만 제너레이터 표현식은 필요할 때 요소를 만들어내므로 메모리를 절약할 수 있습니다.
(식 for 변수 in 반복가능한객체)
>>> [i for i in range(50) if i % 2 == 0] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48] >>> (i for i in range(50) if i % 2 == 0) <generator object <genexpr> at 0x024F02A0>
'C Lang > Python Basic' 카테고리의 다른 글
데코레이터 사용하기2 - 매개변수와 반환값을 처리하는 데코레이터, 가변인수(*args, **kwargs) 함수 데코레이터 (0) | 2019.11.06 |
---|---|
데코레이터 사용하기1 - 데코레이터 만들기 (0) | 2019.11.06 |
제너레이터 사용하기2 - 제너레이터 만들기 (0) | 2019.11.06 |
제너레이터 사용하기1 - 제너레이터와 yield 알아보기 (0) | 2019.11.06 |
클로저 사용하기2 - 클로저 사용하기: 클로저의 개념, lambda로 클로저 만들기, 클로저로 지역변수 변경하기 (0) | 2019.11.06 |