이번 학습에서 새로운 로봇 명령문을 어떻게 정의하는지 배울 것입니다. 컴퓨터 프로그램을 작성할 때, 3번째 유용한 규칙을 보게 됩니다.
곰곰이 생각한다면, 리보그가 왼쪽으로 세 번 돌게 하는 것은 오른쪽으로 한번 도는 것과 같은 결과를 줍니다. 종이 위에 그려서, 컴퓨터 없이 다음 프로그램이 리보그가 수행하는 것을 이해해 보세요.
turn_left() move() turn_left() turn_left() turn_left() move() move() turn_left() turn_left() turn_left() move() turn_left() turn_left() turn_left() move() move() turn_left() turn_left() turn_off()
위 프로그램을 작성하고 저장하세요. 리보그가 여러분이 기대하는 것을 리보그가 수행하는지 살펴보세요.
방금 전에 저장한 프로그램을 수정하여, 아래 사각형에서 보이듯이 리보그가 시계방향으로 선을 따라 돌도록 만드세요.
앞에서 3번의 왼쪽 돌기를 조합해서 리보그가 어떻게 오른쪽으로 한번 도는지를 살펴봤습니다. 일련의 오른쪽 돌기를 만든다면, 작성된 결과 코드를 작성하고 읽는 것은 무척이나 지루한 일이 될 것입니다. 왜냐 하면, 반복을 계속하기 때문입니다. 다르게 말씀 드려, 동일한 일련의 명령문이 프로그램에서 다른 곳에 여러 번 반복하여 나타난다는 것입니다. 이런 중복을 피하기 위해서, 파이썬에 프로그램된 리보그의 능력은 매우 도움이 됩니다.
파이썬에서, 일련의 명령문에 간단한 이름을 부여할 수 있습니다. 예를 들어, 아래와 같이 리보그가 오른쪽 회전 명령문을 정의할 수 있습니다.
4가지 중요한 점에 주목하세요.
한번에 너무 많은 정보를 보여준 것처럼 보입니다. 이 새로운 키워드를 얼마나 잘 이해하고 있는지 확인하는 좋은 시간입니다.
아래 1), 2)를 만족하는 프로그램을 작성하세요.
최종 프로그램이 처음 프로그램보다 짧고, 리보그가 움직이는 선을 이해하기 쉽다는 것을 알게 됩니다.
step_back() 명령문을 정의하세요.
# step_back() defined up here
move()
step_back()
turn_off()
step_back() 명령문은 리보그가 앞으로 한 칸 전진하고 다시 처음 출발자리로 돌아와서 아래와 같이 처음과 같이 같은 방향을 응시합니다.
힌트: 새로운 정의의 일부분인 명령문을 들여쓰기 하는 것을 잊지 마세요.
turn_around() 명령문을 정의해서, 다음 새로운 명령문이 여러분이 기대하는 것을 리보그가 수행하는지 확인하세요.
def step_back(): turn_around() move() turn_around() def turn_right(): turn_around() turn_left()
앞 선행학습에서 여러분이 작성한 마지막 연습문제 중에 하나가 리보그가 신문 배달하는 프로그램을 작성하는 것입니다. 신문배달 프로그램 상기하기 위해서 여기 리보그가 해야하는 것을 시각적으로 표현했습니다.
신문배달 문제의 해답은 아마 아래와 같을 것입니다.
move() # climb step turn_left() move() turn_left() turn_left() turn_left() move() move() # climb step turn_left() move() turn_left() turn_left() turn_left() move() move() # climb step turn_left() move() turn_left() turn_left() turn_left() move() move() # climb step turn_left() move() turn_left() turn_left() turn_left() move() move() # put down newspaper and turn around put_beeper() turn_left() turn_left() # step down move() move() turn_left() move() turn_left() turn_left() turn_left() # step down move() move() turn_left() move() turn_left() turn_left() turn_left() # step down move() move() turn_left() move() turn_left() turn_left() turn_left() # step down move() move() turn_left() move() turn_left() turn_left() turn_left() # move away and stop move() turn_off()
타이핑이 정말 많고, 반복이 정말 많습니다. 프로그램 마지막에 도달했을 때는 프로그램의 시작을 화면에서 볼 수 없습니다. 프로그램에서 어디에 있는지를 추적하는 것을 돕도록 제가 몇 개의 주석을 넣은 것을 알 수 있습니다. 프로그램 프로그램 해결책 개요가 나올 때, 주석은 생각하는 블록에 가까이 위치합니다.
파이썬 방식(Pythonic form)으로 프로그램 개요를 적어봅시다.
climb_up_four_stairs() put_beeper() turn_around() climb_down_four_stairs()
신문배달 프로그램의 완벽한 해결책은 아닙니다. [예를 들어, turn_off() 명령문이 빠져있습니다.] 하지만, 전과 비교하여 읽기 훨씬 쉽고 다음의 새로운 명령문이 정의된다면 최종 프로그램에 좀더 가까이 다가갔습니다. 여기 필요한 몇몇 정의 명령문이 있습니다./p>
def turn_around(): turn_left() turn_left() def turn_right(): turn_left() turn_left() turn_left() def climb_up_one_stair(): turn_left() move() turn_right() move() move() def climb_up_four_stairs(): climb_up_one_stair() climb_up_one_stair() climb_up_one_stair() climb_up_one_stair()
빠진 정의 명령문을 추가하여 최종 프로그램이 파이썬 방식 버전처럼 보이게 만들어 보세요. turn_off() 포함해서, 몇 개 간단한 명령문을 추가할 필요가 있습니다. 프로그램을 저장하고, 원래 프로그램과 다른 이름을 사용하는 것을 잊지 마세요.
신문 배달 프로그램의 최초 버전과 가장 마지막 버전과 비교하는 시간을 가져보세요. 어느 것이 읽기 쉬운가요?
잘 지은 이름은 프로그램이 무엇을 수행하는 이해하는데 정말 도움을 줍니다. 마찬가지로, 잘못 지은 이름은 프로그램을 이해하는데 어려움을 줍니다. [규칙 4를 보세요] 컴퓨터를 실행하지 말고, 다음 프로그램이 무엇을 하는지 이해해 보세요.
def a(): turn_left() turn_left() def b(): turn_left() a() def c(): move() move() def d(): c() b() def e(): d() d() d() d() turn_left() e() b() turn_off()
a(), b(), c(), d(), e() 명령문에 좀더 서술적인 이름이 유용하다는 것을 알 수 있습니다.