세번째 규칙 ============= .. index:: 규칙 # 3 이제, 컴퓨터 프로그램을 효과적으로 작성하는 세번째 규칙을 학습할 준비가 되었다. .. important:: **규칙 # 3** 프로그램을 작성할 때, 되풀이 반복하지 마세요. 다시 말씀드립니다. **되풀이 반복하지 마세요!** 좌회선 세번하면 우회전한다. ---------------------------- 지금까지 프로그램 몇개를 작성했기 때문에, 리보그가 세번 연속해서 좌회전하면 마치 우회전 한번 한것과 같은 결과가 됨을 인식해야만 된다. 리보그가 매번 우회전할 때마다, ``turn_left()`` 명령어를 세번 작성하는 것이 꽤 지겹다는 것을 아마도 알게 된다. 만약 단순히 ``turn_right()`` 작성하게 되면 멋지지 않겠는가? 이번 학습 말미에서, 단지 이것만 할 수 있게 된다. 함수 정의 ------------------ 지금까지 *지시(instructions)* 혹은 *명령어(commands)* 이라고 부른 것이 파이썬 **함수(function)** 의 사례다. 다음과 같이 새로운 파이썬 함수를 정의할 수 있다: .. index:: ! def .. code-block:: python def some_well_chosen_name (): # 코드를 여기 적는다. # 같은 열에 들여쓰기 한다. ``def`` 가 첫번째 파이썬 **키워드(keyword)** 다. 키워드는 해당 프로그래밍 언어에서 특별한 의미가 있는 단어다. 콜론 ``:`` 이 *코드 덩어리* 로 알려진 것보다 선행하고, 함수 *몸통(body)* 을 구성하는 방법에 주목한다. 각줄 시작지점에 동일 숫자 공백을 갖는 코드 덩어리를 들여쓰기하는 것이 파이썬에서 **필요하다.** 들여쓰기를 하는 것이 사람 독자가 함수 몸통을 식별하기 쉽게 만든다. 첫번째 파이썬 함수를 작성해 보자:: def turn_right(): turn_left() turn_left() turn_left() 됐다! 우회전을 하는데, ``turn_left()`` 함수를 세번 작성하는 것을 이제 회피할 수 있다. .. topic:: 시도해 보기! 프로그램에서 ``turn_right()`` 함수를 정의하고, 아마도 ``Alone`` 세상에서 사용해보자. 무엇을 시도할지 확실히 모른다면, 연속해서 4번 ``turn_right()`` 와 ``move()`` **함수** 를 번갈아 실행해서 리보그가 정사각형을 돌아다니게 한다. ``def`` 에 관해 생각하는 방법 ------------------------------- .. note:: 단순화한 설명은 *변수 범위(variable scope)* 로 알려진 것을 고려하지 않음에 주목한다. 나중에 다룰 것이다. 파이썬에서 함수를 정의하는 방법을 방금 살펴봤다. 가능성이 함수에 관해 생각하는 방법을 바로 이해할 수 있지만, 행여나 다음에 좀더 자세한 설명이 있어서, 여러분이 함수 동작하는 방법과 코드 덩어리에 관계된 다른 파이썬 생성자를 이해할 수 있게 한다. 다음 코드가 있다고 가정하자: .. code-block:: python :emphasize-lines: 7 def turn_right(): # 코드 덩어리 시작 turn_left() turn_left() turn_left() # 코드 덩어리 끝 move() turn_right() move() 상기 코드는 다음과 동치다: .. code-block:: python :emphasize-lines: 9, 10, 11 # 함수를 정의한다 def turn_right(): turn_left() turn_left() turn_left() move() # turn_right() 내부 코드 덩어리 시작 turn_left() turn_left() turn_left() # 코드 덩어리 끝 move() 다른 말로, ``def`` 는 코드 덩어리 내부에 나타낸 모든 코드에 대해서 동의어로 사용할 수 있는 명칭이다. 동의어가 **호출(called)** 되는 [즉, 함수 명칭 다음에 ()이 붙는다] 것을 볼 때마다, 해당 지점에 *있는 그대로* 코드 덩어리를 삽입하는 것에 상응하는 것으로 간주할 수 있다. .. topic:: 시도해 보기! 신문배달 문제에서 작성한 프로그램을 단순화할 수 있는지, ``turn_right()`` 함수를 사용해서 가독성이 좋고 이해하기 더 쉽게 만들 수 있는지 알아보라. 이렇게 작업하고 나면, 아마도 다른 함수를 정의해서 작성한 프로그램을 단순화할 수 있는 다른 방법을 생각할 수도 있다.