이전 항목

12. 연습문제 읽어서 해독하기

다음 항목

14. 반복

현재 문서

주의사항

해당 문서는 중요 변경 작업 중에 있습니다. 일부 문서에 텍스트가 빠져있거나, 불어로 플레이스홀더(placeholder) 자리차지만 되어 있을 수 있습니다.

13. 신문배달 재방문

신문배달 연습문제로 되돌아 가자; Newspaper 0 세상에 나온 리차드 패티스 교수님께 신문배달하는 것을 생각해보자. 주석이 몇개 추가되고, 해당 문제에 대한 해답이 아래에 나와 있다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 take() # 별(star) 신문을 집는다.

 # 일층으로 올라간다
 turn_left()
 move()
 turn_left()
 turn_left()
 turn_left()
 move()
 move()

 # 이층으로 올라간다
 turn_left()
 move()
 turn_left()
 turn_left()
 turn_left()
 move()
 move()

 # 삼층으로 올라간다
 turn_left()
 move()
 turn_left()
 turn_left()
 turn_left()
 move()
 move()

 put() # 신문을 내려놓는다

 # 뒤돌아 선다
 turn_left()
 turn_left()

 # 한층 내려온다
 move()
 move()
 turn_left()
 move()
 turn_left()
 turn_left()
 turn_left()

 # 한층 내려온다
 move()
 move()
 turn_left()
 move()
 turn_left()
 turn_left()
 turn_left()

 # 한층 내려온다
 move()
 move()
 turn_left()
 move()
 turn_left()
 turn_left()
 turn_left()

상기 해답은 꽤 길다... 타이핑할 때 실수를 저지르기 쉽다. 함수로 만들 수 있는 반복되는 코드 부분이 일부 있음에 주목한다. 이미 turn_right()turn_around() 함수를 정의했다; 이미 정의한 함수를 사용하고 몇가지를 더 정의하자.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 from library import turn_right, turn_around

 def climb_up_one_floor():
     turn_left()
     move()
     turn_right()
     move()
     move()

 def climb_up_three_floors():
     climb_up_one_floor()
     climb_up_one_floor()
     climb_up_one_floor()

 def climb_down_one_floor():
     move()
     move()
     turn_left()
     move()
     turn_right()

 def climb_down_three_floors():
     climb_down_one_floor()
     climb_down_one_floor()
     climb_down_one_floor()


 # === 함수 정의 끝 ===

 take()  # 별 신문을 집는다.
 climb_up_three_floors()
 put() # 신문을 놓는다.
 turn_around()
 climb_down_three_floors()

각 함수는 5개가 되지 않는 명령어를 담고 있다; 이전에 했던 것처럼 전체 명령어 목록을 확인하는 것보다 각 함수가 해야 되는 것을 수행하는지 확인하는 것이 훨씬 더 쉽다. 함수가 무엇을 수행하는지 알고나면, 함수를 사용해서 5 줄 가량되는 온전한 프로그램을 작성할 수 있게 된다. 다시 프로그램이 올바르다는 것을 확인하기가 더 수월해진다. 반복을 회피하는 함수를 사용해서, 결국 읽기 훨씬 더 쉬운 더 짧은 프로그램을 만들게 되었다.

여러분 차례!

상기 신문배달 프로그램을 작성해서 올바르게 동작하는지 확실히 하라. 프로그램이 완료되면, 이제 더 단순하게 프로그램을 만들 수 있는 또다른 기법을 배울 준비를 마쳤다.

climb_up_one_floor(), climb_up_three_floors 같은 함수는 해당 문제에만 특정되기 때문에, 라이브러리(library)에 작성한 함수를 저장하는 것이 아마도 좋은 생각은 아니다. ; 본인 라이브러리에 너무 많은 함수를 갖고 싶지는 않고 항상 라이브러리에만 있는 함수만 기억했으면 한다. 만약 다른 프로그램에서 함수를 수도 없이 사용하고자 한다면, 라이브러리에 함수를 담아 두는 것은 좋은 생각이 된다.