목차

이전 항목

8. 신문 배달

다음 항목

10. 돌아서다

현재 문서

주의사항

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

9. 세번째 규칙

이제, 컴퓨터 프로그램을 효과적으로 작성하는 세번째 규칙을 학습할 준비가 되었다.

중요

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

9.1. 좌회선 세번하면 우회전한다.

지금까지 프로그램 몇개를 작성했기 때문에, 리보그가 세번 연속해서 좌회전하면 마치 우회전 한번 한것과 같은 결과가 됨을 인식해야만 된다. 리보그가 매번 우회전할 때마다, turn_left() 명령어를 세번 작성하는 것이 꽤 지겹다는 것을 아마도 알게 된다. 만약 단순히 turn_right() 작성하게 되면 멋지지 않겠는가?

이번 학습 말미에서, 단지 이것만 할 수 있게 된다.

9.2. 함수 정의

지금까지 지시(instructions) 혹은 명령어(commands) 이라고 부른 것이 파이썬 함수(function) 의 사례다. 다음과 같이 새로운 파이썬 함수를 정의할 수 있다:

def some_well_chosen_name ():
    # 코드를 여기 적는다.
    # 같은 열에 들여쓰기 한다.

def 가 첫번째 파이썬 키워드(keyword) 다. 키워드는 해당 프로그래밍 언어에서 특별한 의미가 있는 단어다. 콜론 :코드 덩어리 로 알려진 것보다 선행하고, 함수 몸통(body) 을 구성하는 방법에 주목한다. 각줄 시작지점에 동일 숫자 공백을 갖는 코드 덩어리를 들여쓰기하는 것이 파이썬에서 필요하다. 들여쓰기를 하는 것이 사람 독자가 함수 몸통을 식별하기 쉽게 만든다.

첫번째 파이썬 함수를 작성해 보자:

def turn_right():
    turn_left()
    turn_left()
    turn_left()

됐다! 우회전을 하는데, turn_left() 함수를 세번 작성하는 것을 이제 회피할 수 있다.

시도해 보기!

프로그램에서 turn_right() 함수를 정의하고, 아마도 Alone 세상에서 사용해보자. 무엇을 시도할지 확실히 모른다면, 연속해서 4번 turn_right()move() 함수 를 번갈아 실행해서 리보그가 정사각형을 돌아다니게 한다.

9.3. def 에 관해 생각하는 방법

주석

단순화한 설명은 변수 범위(variable scope) 로 알려진 것을 고려하지 않음에 주목한다. 나중에 다룰 것이다.

파이썬에서 함수를 정의하는 방법을 방금 살펴봤다. 가능성이 함수에 관해 생각하는 방법을 바로 이해할 수 있지만, 행여나 다음에 좀더 자세한 설명이 있어서, 여러분이 함수 동작하는 방법과 코드 덩어리에 관계된 다른 파이썬 생성자를 이해할 수 있게 한다.

다음 코드가 있다고 가정하자:

 def turn_right():  # 코드 덩어리 시작
     turn_left()
     turn_left()
     turn_left()   # 코드 덩어리 끝

 move()
 turn_right()
 move()

상기 코드는 다음과 동치다:

 # 함수를 정의한다
 def turn_right():
     turn_left()
     turn_left()
     turn_left()

 move()
 # turn_right() 내부 코드 덩어리 시작
 turn_left()
 turn_left()
 turn_left()
 # 코드 덩어리 끝
 move()

다른 말로, def 는 코드 덩어리 내부에 나타낸 모든 코드에 대해서 동의어로 사용할 수 있는 명칭이다. 동의어가 호출(called) 되는 [즉, 함수 명칭 다음에 ()이 붙는다] 것을 볼 때마다, 해당 지점에 있는 그대로 코드 덩어리를 삽입하는 것에 상응하는 것으로 간주할 수 있다.

시도해 보기!

신문배달 문제에서 작성한 프로그램을 단순화할 수 있는지, turn_right() 함수를 사용해서 가독성이 좋고 이해하기 더 쉽게 만들 수 있는지 알아보라. 이렇게 작업하고 나면, 아마도 다른 함수를 정의해서 작성한 프로그램을 단순화할 수 있는 다른 방법을 생각할 수도 있다.