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]
# 함수 안에 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
위 코드를 다시 살펴보자!
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)
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/