일반적으로 함수의 반환 값은 return으로 정해진다.
함수의 부분에 return 이 나타나면 return 다음에 나오는 변수를 반환하고 함수는 종료된다.
return 대신에 yield 가나타나면, python은 그 함수를 generator로 인식하며 next 함수가 작동할수 있게 된다.
예제)
In [31]: def G():
...: n=0
...: while True:
..........: input = yield 'output'
..........: n=n+1
..........: print(n)
...:
In [39]: g=G()
In [40]: next(g) # 함수 4번째 줄까지만 실행됨
Out[40]: 'output'
In [41]: next(g) #함수 5,6 줄이 실행되고 다시 while loop 처음으로 돌아가 두번째 yield까지 실행됨
1
Out[41]: 'output'
In [42]: next(g)
2
Out[42]: 'output'
In [43]: next(g)
3
Out[43]: 'output'
위 예제에서 yield 식의 값은 항상 None이다.
함수 안에 yield 가 존재하면 python은 generator로 인식하고, next함수에 의하여 call되면,
1. 최초에는 함수의 처음부터 yield가 나타나는 지점까지만 시행되고 yield 가 반환한 값을 반환하면서 종료된다.
2. 종료된 지점과 값은 그대로 메모리에 남아 있다가
3. 다음 next가 시행되면 기억된 지점과 변수를 사용하여 아까 중단된 시점부터 다음 yield가 작동될때 까지 함수가 실행된다.
4. 위 예제에선 while loop 안에 yield가 있으므로 무한히 작동되고 첫줄의 n=0는 한번만 시행된다.
5. while loop 안에 없거나 함수의 끝에 도달되면 generator 끝에 도달하는 것과 같이 에러를 내며 종료한다.
예제2)
In [62]: def G2():
...: n=0
...: yield 'output'
...: n=n+1
...: print(n)
...: yield n
...:
In [63]: g=G2()
In [64]: next(g) # 함수 3번째 줄까지만 실행됨
Out[64]: 'output'
In [65]: next(g) # 함수 4,5,6번째 줄이 실행됨
1
Out[65]: 1
In [66]: next(g) # 다음 yield는 없으므로 에러를 내며 종료됨
Traceback (most recent call last):
File "", line 1, in
next(g)
StopIteration