주의사항
해당 문서는 중요 변경 작업 중에 있습니다. 일부 문서에 텍스트가 빠져있거나, 불어로 플레이스홀더(placeholder) 자리차지만 되어 있을 수 있습니다.
신문배달 연습문제로 되돌아 가자; 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)에 작성한 함수를 저장하는 것이 아마도 좋은 생각은 아니다. ; 본인 라이브러리에 너무 많은 함수를 갖고 싶지는 않고 항상 라이브러리에만 있는 함수만 기억했으면 한다. 만약 다른 프로그램에서 함수를 수도 없이 사용하고자 한다면, 라이브러리에 함수를 담아 두는 것은 좋은 생각이 된다.