• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

코루틴 Ex2 관련 질문 드립니다.

23.08.18 20:13 작성 23.08.18 20:20 수정 조회수 187

0

안녕하세요. 강의 감사히 잘 듣고 있는 수강생입니다.

코루틴 Ex2 관련 내용 중 궁금한 점이 있어 질문 드립니다.

def coroutine2(x): 
    print('>>> coroutine started : {}'.format(x))
    y = yield x 
    print('>>> coroutine received : {}'.format(y))
    z = yield x + y 
    print('>>> coroutine received : {}'.format(x+y))
    print('>>> coroutine received : {}'.format(z))

cr3 = coroutine2(10)

from inspect import getgeneratorstate

print(getgeneratorstate(cr3)) # 상태 체크
print(next(cr3))
print(getgeneratorstate(cr3))
cr3.send(100) 
print(getgeneratorstate(cr3))
cr3.send(30) 

위 코드를 실행하면

GEN_CREATED

>>> coroutine started : 10

10

GEN_SUSPENDED

>>> coroutine received : 100

GEN_SUSPENDED

>>> coroutine received : 110

>>> coroutine received : 30

 

결과가 이처럼 나오는데, 두번째 GEN_SUSPENDED 이후가 이해가 잘 가지 않습니다.

첫 번째 cr3.send(100)은 y = yield x 의 x에 100을 넣어서 y의 print 문에서 received : 100이 나온 것으로 생각했는데,

두 번째 cr3.send(30)은 z = yield x + y의 x에 30을 넣는다고 생각하여 z의 print문(마지막 부분)이 130이 나와야 할 것 같은데 30이 나와서 혼란스럽습니다.

 

z = yield x + y 에 suspended 상태일 때

send를 통해서 서브루틴으로 값을 보내면 x와 y 값에 상관 없이 그냥 z에 30을 넣는 것인가요?

z = yield x + y 대신에

z = yield x 를 넣어도 결과는 동일한 것 같은데 어떤 차이가 있는지 궁금합니다.

메인루틴에서 받는 것만 달라지는 걸까요?

그리고 print(cr3.send(30)) 과 같은 형태로 서브루틴에서 메인루틴으로 준 것을 볼 수 있다고 하셨는데, print 말고 제가 직접 그 값을 쓰려면 어떻게 해야 하는지도 여쭤봅니다.

감사합니다.

 

 

답변 1

답변을 작성해보세요.

0

안녕하세요.

우선 열심히 하셔서 너무 보기 좋습니다~

한 가지 질문안에 너무 많은 질문은 제가 답변 드리기가 곤란할 것 같습니다.

다시 정리하셔서 질문을 한 가지 형태로 올려주시면 좋을 것 같아요.

과외 형식으로 제가 답변드릴 수는 없기 때문에 질문을 하단 댓글로 부탁드립니다.

많은 질의 응답은 인프런 멘토링 기능도 활용할 수 있습니다.

아울러, 질의답변은 몇 일정도 소요될 수 있습니다.

감사합니다.

힌턴님의 프로필

힌턴

질문자

2023.08.21

안녕하세요. 우선 코드 내용은 제외하고 질문만 정리하겠습니다.

<질문1>

z = yield x + y 라인에 suspended 상태일 때,

메인루틴에서 send(30)을 통해 서브루틴으로 값을 보내면 함수 내 x와 y 값에 무관하게 z에 30을 넣는 것인가요?

힌턴님의 프로필

힌턴

질문자

2023.08.21

<질문2>

z = yield x + y 대신에

z = yield x 를 넣어도 결과는 동일한 것 같은데 어떤 차이가 있는지 궁금합니다.

<질문3>

메인루틴에서 서브루틴으로 값을 줄 때는 send로 보내는 것 같은데, 서브루틴에서 메인루틴으로 주는 값은 제가 어떻게 받을 수 있는지 궁금합니다. 키워드라도 알려주시면 찾아서 보겠습니다.

감사합니다. 인프런이 처음이라 멘토링 기능이 있는지 몰랐는데, Q&A 게시판에서 질문 드릴 수 있는 질문 수에 한계가 있다면 멘토링 기능을 활용해 보겠습니다. 감사합니다.

중간에 print문을 통해서 x,y,z 를 출력해 보시면 알 수 있는 내용입니다.

첫 10이 들어가고 이 값은 y에 할당 됩니다

그다음 100이 들어가고 x 에 할당 됩니다. 그래서 100 + 10 = 110이 출력됩니다.

다음에는 30이 들어가는데 할당가능한 곳이 z 밖에 없습니다. 이 부분은 말씀하신게 맞습니다.

질문2와 질문3은 외부 내부 값 주고받는 내용은 강의 내용중에도 확인 가능하고

링크로 대신합니다. 잘 나와 있으니 시간을 들여서 정독해 보세요.

중간에 그림 부분을 정확하게 이해하시면 됩니다.

https://dojang.io/mod/page/view.php?id=2419