inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

파이썬 중급

이터레이터와 제너레이터 4

이터레이터와 제러네이터 4 - 재귀 제너레이터

117

조성수

작성한 질문수 2

0

안녕하세요 강사님.

제목의 강의 중에서 depth_first 함수의 동작이 궁금하여 기본 코드에서 "2.코드 변경"과 같이 print 문을 추가 하여 분석 중 "3. 실행결과"와 같이 출력 되는 것을 확인 하였습니다.

  1. 질문

Node(3) 출력하기 전에 s-yield가 한번 출력 되어야 할 것 같은데 두 번 출력에 대한 해석이 안됩니다.

f-yield Node(3)
s-yield Node(1) Node(3)
s-yield Node(0) Node(3)
Node(3)

@@추가

질문을 올려 놓고 고민 하다 보니 Node(1).depth_first() 함수가 한번만 호출 된다고 생각했는데.

프로그램이 종료 될 때 까지 총 4번이 호출 되면 말이 되는 듯 한데.. 추측한 시나리오가 맞는지요?

Node(1).depth_first() : next(Node(1)) 4번 호출

Node(3).depth_first() : next(Node(3)) 2번 호출

Node(4).depth_first() : next(Node(4)) 2번 호출

Node(2).depth_first() : next(Node(2)) 3번 호출

Node(5).depth_first() : next(Node(5)) 2번 호출

 

  1. 코드 변경

    def depth_first(self):
        print("f-yield",self)
        yield self
        print("f-next",self)
        
        for c in self:
            for x in c.depth_first():
                print("s-yield",self,x)
                yield x
                print("s-next",self,x)
  1. 실행 결과

f-yield Node(0)
Node(0)
f-next Node(0)
f-yield Node(1)
s-yield Node(0) Node(1)
Node(1)
s-next Node(0) Node(1)
f-next Node(1)
f-yield Node(3)
s-yield Node(1) Node(3)
s-yield Node(0) Node(3)
Node(3)
s-next Node(0) Node(3)
s-next Node(1) Node(3)
f-next Node(3)
f-yield Node(4)
s-yield Node(1) Node(4)
s-yield Node(0) Node(4)
Node(4)
s-next Node(0) Node(4)
s-next Node(1) Node(4)
f-next Node(4)
f-yield Node(2)
s-yield Node(0) Node(2)
Node(2)
s-next Node(0) Node(2)
f-next Node(2)
f-yield Node(5)
s-yield Node(2) Node(5)
s-yield Node(0) Node(5)
Node(5)
s-next Node(0) Node(5)
s-next Node(2) Node(5)
f-next Node(5)

python numpy matplotlib 웹-스크래핑 병렬-처리

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.
조성수님께서 궁금해하신 내용에 대해 설명드리겠습니다.

재귀 제너레이터 함수 depth_first는 노드를 깊이 우선 탐색하며 각 노드에서 yield문이 작동할 때마다 현재의 노드를 반환합니다. 추가하신 print문 덕분에 이 함수의 실행 흐름을 잘 문맥적으로 보실 수 있습니다.

질문하신 대로 Node(1).depth_first() 호출이 여러 번 발생하는 이유는 이 함수가 제너레이터이기 때문입니다. 제너레이터는 next() 호출 시마다 yield 지점에서 나갑니다. 즉, 제너레이터를 통해 루프를 돌면, 각각의 노드에서 yield 지점으로 들어가고 나가는 과정이 반복됩니다.

제너레이터 호출이 여러 번 발생하는 것은 각 자식 노드로 내려간 다음 자식 노드를 탐색을 마친 후 다시 돌아오면서 상위 노드에서의 for문이 계속 진행되기 때문입니다. 따라서 루트를 포함한 각 노드의 depth_first 함수 호출이 여러 번 발생합니다.

다음은 코드의 흐름에 대한 설명입니다:
1. f-yieldf-next는 각각 노드가 yield되기 전과 후의 상태를 나타냅니다.
2. s-yields-next는 부모 노드의 컨텍스트에서 자식 노드에 대한 yield 전과 후의 상태를 나타냅니다.

이 점을 염두에 두시고 호출의 흐름을 따라가면 모든 yield 호출이 이해가 되실 것입니다. 추가로 코드를 시각적으로 디버깅하며 노드의 탐색 순서를 확인하는 것도 도움이 될 것입니다.

제시된 재귀 탐색 예시를 이용하여 이해를 깊게 하시길 바랍니다. 추가적인 내용이 필요하시면 언제든지 문의 주세요!

자세한 내용 보기

뒤로가기 버튼 같은 것이 있나요?

0

6

0

Replit 강의 자료가 안나와요

0

8

1

강의 연장 문의

0

10

1

프로그램 실행시간에 대한 질문

1

13

2

비중 및 매수 종목수 조정.

1

13

2

Claude api가 소식 동기화가 늦는 문제

1

19

2

[긴급요청2] 28강 동영상 오류(27강 음성 재생) 수정 예정일자를 알려주세요

0

12

1

codex에게 대용량 코드베이스를 인식 시키는 방법은 어떤게 있나요?

0

23

1

출력값 질문

0

21

2

슬롯 관련 문의

1

20

2

수업노트가 어디에 있나요?

0

26

1

[긴급요청] 28강 동영상 전체에 오디오가 잘못들어가있습니다.

0

25

1

실제 계좌 잔고 및 테스트중에

1

56

4

Replit UI 변경으로 인한 실습 진행 문의

1

23

1

29강 5:00

0

29

2

설치 및 설정 가이드 노션 자료는 없나요 ?

0

22

2

실기시험 제출관련

0

157

2

6.20 작업형 2 과적합

0

161

3

install까지 설치 하였는데 start 가안됩니다.

1

26

1

8분54초 테이블 내용 문의

0

25

1

코딩팡 장업형2 베이스 라인 인코딩 종류 질문

0

51

2

multi_tool_agent.py 에서 arxiv tool 에러

0

19

1

def attach_wrapper의 return func를 하는 이유?

0

235

1

eval(repr(p)) 가 진짜 Pair 객체로 만들어지는 이유?

0

260

1