<제너레이터 실습을 위한 피보나치 수열 코드>
def gen_fibon(n):
a = 1
b = 1
for i in range(n):
yield a
a, b = b, a+b
for number in gen_fibon(10):
print(number)
위 코드의 출력값:
1
2
3
5
8
13
21
34
55
위 예제 코드를 gen_fibon 함수 단독으로만 실행하면 그저 자신의 객체만을 반환하게된다. 함수 내부의 해당 코드는 추후 실제로 for 루프로 제너레이터를 돌릴 때 실행된다.
함수로부터 만들어진 제너레이터 객체가 for 루프를 통해 처음 실행될 때, Python은 함수 내에 있는 코드를 yield 키워드를 만나기 전까지 실행하고 첫 번째 루프의 값을 반환한다. 다음 루프 때에는 yield 키워드 뒤에 있는 코드를 실행하고 다시 루프를 돌면서 반환할 값이 모두 소진되어 없을때까지 계속 같은 과정을 반복하게 된다.
모든 값에 대한 반환이 완료되면 iteration이 종료된다. 모든 값은 단 한번만 순회한다는 특징을 지닌다.
<Yield의 대기하는 성질을 보여주는 코드>
#1번 예제
def simple_gen():
for x in range(3):
yield x
for number in simple_gen():
print(number)
g = simple_gen()
print(next(g)) #출력값: 0
print(next(g)) #출력값: 1
print(next(g)) #출력값: 2 이후 프로그램 종료
# 2번 예제
s = 'hello'
# for letter in s:
# print(letter)
s_iter = iter(s)
print(next(s_iter)) #h
print(next(s_iter)) #e
print(next(s_iter)) #l
print(next(s_iter)) #l
print(next(s_iter)) #o