[Python] Generator Yield 이해하기

Joo·2023년 7월 26일

Python

목록 보기
1/2

Situation

Combination을 구현하는 방법을 찾아보다가 yield를 사용한 코드를 찾았다..
코드는 정말 간단한데 yield를 이해하는게 어렵다.
더 깊이 알아보자!

def combination(arr, r):
	for i in range(len(arr)):
    	# 마지막 원소를 선택할 때
    	if r == 1:
        	yield [arr[i]]
        else:
        	# 다음 원소를 뽑기 위해 재귀함수 호출
        	for next in combination(arr[i+1:], r-1):
            	yield [arr[i]] + next
		
for c in combination(list(range(5), 3)):
	print(c)

출력
[0, 1, 2]
[0, 1, 3]
[0, 1, 4]
[0, 2, 3]
[0, 2, 4]
[0, 3, 4]
[1, 2, 3]
[1, 2, 4]
[1, 3, 4]
[2, 3, 4]

1. Yield로 Generator 사용하기

# 함수 안에 yield를 사용하면 generator 함수가 된다.
def generator():
	yield 0 # yield 에 0 이라는 값을 지정한다.
    yield 1
    yield 2

# yield에 지정한 값이 반복문을 통해 출력된다!
for number in generator():
	print(number)

출력
0
1
2

함수를 return으로 반환하는 코드랑 확실하게 비교하면 다르게 동작하는 것을 알수있다.

(1) return으로 반환하는 코드

import time

def returnABC():
	lst = []
    for s in 'ABC':
    	time.sleep(1) # 1초 딜레이
        lst.append(s)
    return lst

for ans in returnABC():
	print(ans)

출력
# 3초 경과
A
B
C

(2) yield로 generator를 사용한 코드

import time

def generatorABC():
	for s in 'ABC':
    	time.sleep(1) # 1초 딜레이
        yeild s
        
for ans in generatorABC():
	print(ans)

출력
# 1초 경과
A
# 1초 경과
B
# 1초 경과
C

2. for문에서 Generator를 사용하면 어떻게 동작하는 걸까?

위 코드를 다시 살펴보자!
Generator 함수를 for문에서 사용하면 반복할 때마다 __next__ 를 호출하면 yield에 지정된 값이 반환되어 가져온다.
그리고 더 호출할 __next__ 메서드가 없다면 Generator 반복을 종료한다!

# 함수 안에 yield를 사용하면 generator 함수가 된다.
def generator():
	yield 0 # yield 에 0 이라는 값을 지정한다.
    yield 1
    yield 2

# yield에 지정한 값이 반복문을 통해 출력된다!
for number in generator():
	print(number)

3. __next__ 메서드로 동작과정을 살펴보자.

generator 객체를 생성해 next 메서드를 실행하면 yield에 지정된 값을 출력하는 것을 알수있다.

def number_generator():
    yield 0    # 0을 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보
    yield 1    # 1을 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보
    yield 2    # 2를 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보
 
g = number_generator()
 
a = next(g)    # yield를 사용하여 함수 바깥으로 전달한 값은 next의 반환값으로 나옴
print(a)       # 0
 
b = next(g)
print(b)       # 1
 
c = next(g)
print(c)       # 2

참고 사이트

https://dojang.io/mod/page/view.php?id=2412
https://www.daleseo.com/python-yield/

profile
한 줄이 모여 책이 되듯 기록하기

0개의 댓글