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

In [1]: m=[[1,2,3],[4,5,6],[7,8,9]]

In [2]: m
Out[2]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [28]: a=map(sum,m)
#리스트 m의 원소들을 차례대로 입력 받아 함수에 넣고 값을 map object로 반환한다.

In [29]: a
Out[29]: <map at 0x278d2de6860>
 
 
In [31]: next(a)
Out[31]: 6
 
In [33]: next(a)
Out[33]: 15

In [34]: next(a)
Out[34]: 24 
 
 
In [36]: a=list(map(sum,m))

In [37]: a
Out[37]: [6, 15, 24]

In [38]: a=set(map(sum,m))

In [39]: a
Out[39]: {6, 15, 24}

In [40]: a=tuple(map(sum,m))

In [41]: a
Out[41]: (6, 15, 24) 

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

yield, return  (0) 2019.12.27

+ Recent posts