10. 확실히 반복 피하기

이번 학습에서 새로운 로봇 명령문을 어떻게 정의하는지 배울 것입니다. 컴퓨터 프로그램을 작성할 때, 3번째 유용한 규칙을 보게 됩니다.

규칙 # 3
프로그램을 작성할 때, 자신을 반복하지 마세요.
다시 말씀드립니다. 자신을 반복하지 마세요!

1. 왼쪽으로 세 번 도는 것은 오른쪽 한번 돌게 만듭니다.

곰곰이 생각한다면, 리보그가 왼쪽으로 세 번 돌게 하는 것은 오른쪽으로 한번 도는 것과 같은 결과를 줍니다. 종이 위에 그려서, 컴퓨터 없이 다음 프로그램이 리보그가 수행하는 것을 이해해 보세요.

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()

여러분 차례

위 프로그램을 작성하고 저장하세요. 리보그가 여러분이 기대하는 것을 리보그가 수행하는지 살펴보세요.

다시 여러분 차례!

방금 전에 저장한 프로그램을 수정하여, 아래 사각형에서 보이듯이 리보그가 시계방향으로 선을 따라 돌도록 만드세요.

square with right turns


2. 오른쪽 돌기 정의

앞에서 3번의 왼쪽 돌기를 조합해서 리보그가 어떻게 오른쪽으로 한번 도는지를 살펴봤습니다. 일련의 오른쪽 돌기를 만든다면, 작성된 결과 코드를 작성하고 읽는 것은 무척이나 지루한 일이 될 것입니다. 왜냐 하면, 반복을 계속하기 때문입니다. 다르게 말씀 드려, 동일한 일련의 명령문이 프로그램에서 다른 곳에 여러 번 반복하여 나타난다는 것입니다. 이런 중복을 피하기 위해서, 파이썬에 프로그램된 리보그의 능력은 매우 도움이 됩니다.

파이썬에서, 일련의 명령문에 간단한 이름을 부여할 수 있습니다. 예를 들어, 아래와 같이 리보그가 오른쪽 회전 명령문을 정의할 수 있습니다.

defining turn right

4가지 중요한 점에 주목하세요.

  1. 앞에서 보았듯이, 녹색의 # 기호는 같은 줄의 나머지 모두 리보그(혹은 파이썬)에서 무시합니다. # 기호 텍스트를 주석이라고 하고 다른 프로그래머에게 설명하거나, 다음의 프로그램 명령문이 무슨 역할을 하는지에 대해서 우리 자신에게 상기시키는 용도로 사용됩니다. 녹색으로 보여, 명령문들과 구별되도록 도움을 줍니다. 파이썬 혹은 리보그는 주석을 무시합니다.
  2. 둘째로, 정의는 에디터에서 청색으로 색깔 칠해진 파이썬 키워드 ‘def’입니다. 파이썬 키워드(keyword)는 파이썬 자신이 정의한 자신만의 의미를 가진 단어입니다. def 키워드는 새로운 명령어 이름, 괄호, 그리고 콜론으로 구성됩니다.
  3. 셋째, 새로운 정의의 부분들의 각 명령문들은 동일하게 들여쓰기가 됩니다. 들여쓰기에 문제가 있다면, 파이썬이 불평을 하거나 우리가 기대하는 것을 수행하지 않을 수 있습니다. 들여쓰기는 시작 줄에 빈 공백을 두는 것입니다. 주어진 코드 블록에 4개의 빈 공백을 파이썬에서 관습적으로 사용합니다.
  4. 넷째, 명령문을 정의하는 것은 앞에서 동의어를 새로 만드는 것과는 다른 것입니다. (동의어를 새로 만들 때, 동의어 사이에 ‘=’ 같음 기호를 사용했고 괄호가 없는 것은 명령어가 아니라는 것을 의미합니다).
    Showing indentation guides
  5. 다섯번째, def 키워드 끝에 콜론":"을 추하가여 코드 몸통부분이 시작됨을 나타냅니다. if문과 같은 나중에 배우게 될 다른 파이썬 키워드도 동일하게 적용됩니다.

한번에 너무 많은 정보를 보여준 것처럼 보입니다. 이 새로운 키워드를 얼마나 잘 이해하고 있는지 확인하는 좋은 시간입니다.

여러분 차례

아래 1), 2)를 만족하는 프로그램을 작성하세요.

  1. 오른쪽으로 회전하는 새로운 명령문을 정의하세요.
  2. 새로운 명령문을 이용하여 앞에서와 동일하게 리보그가 시계방향 사각형 선을 따라서 움직이게 하세요.

최종 프로그램이 처음 프로그램보다 짧고, 리보그가 움직이는 선을 이해하기 쉽다는 것을 알게 됩니다.

다시 여러분 차례

step_back() 명령문을 정의하세요.

# step_back() defined up here
move()
step_back()
turn_off()

step_back() 명령문은 리보그가 앞으로 한 칸 전진하고 다시 처음 출발자리로 돌아와서 아래와 같이 처음과 같이 같은 방향을 응시합니다.

back up

힌트: 새로운 정의의 일부분인 명령문을 들여쓰기 하는 것을 잊지 마세요.

또 다시 여러분 차례!

turn_around() 명령문을 정의해서, 다음 새로운 명령문이 여러분이 기대하는 것을 리보그가 수행하는지 확인하세요.

def step_back():
    turn_around()
    move()
    turn_around()

def turn_right():
    turn_around()
    turn_left()

3. 신문 배달, 다시

앞 선행학습에서 여러분이 작성한 마지막 연습문제 중에 하나가 리보그가 신문 배달하는 프로그램을 작성하는 것입니다. 신문배달 프로그램 상기하기 위해서 여기 리보그가 해야하는 것을 시각적으로 표현했습니다.

newspaper start
lead to newspaper end

신문배달 문제의 해답은 아마 아래와 같을 것입니다.

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. 읽기 도전

잘 지은 이름은 프로그램이 무엇을 수행하는 이해하는데 정말 도움을 줍니다. 마찬가지로, 잘못 지은 이름은 프로그램을 이해하는데 어려움을 줍니다. [규칙 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() 명령문에 좀더 서술적인 이름이 유용하다는 것을 알 수 있습니다.

previous 벽 만들기 - home - 다시 반복 피하기 next