일반적으로 함수의 반환 값은 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

 

'Python > function' 카테고리의 다른 글

map  (0) 2019.12.27

+ Recent posts