Composing Programs - 4

Designing Functions
함수는 크고 작은 모든 프로그램의 필수적인 요소이며, 프로그래밍 언어에서 계산 과정을 표현하는 가장 중요한 수단이다. 지금까지 우리는 함수의 형식적 특성과 함수가 어떻게 적용되는지에 대해 논의했다. 이제 우리는 무엇이 좋은 함수를 만드는가라는 주제로 넘어간다.
근본적으로 좋은 함수가 갖추어야 할 자질들을 모두 "함수는 추상화이다"라는 아이디어를 뒷받침한다.
- 한가지 일만 수행하기 : 각 함수는 정확히 하나의 작업만 수행해야 한다. 그 작업은 짧은 이름으로 식별할 수 있어야 하며, 한 줄의 텍스트로 설명될 수 있어야 한다. 여러 작업을 순차적으로 수행하는 함수는 여러개의 함수로 나누어야 한다.
- 반복하지 말 것(DRY 원칙) : 자신을 반복하지 마라 (Don't Repeat Yourself)는 소프트웨어 공학의 핵심 원칙이다. 소위 DRY 원칙은 여러 코드 조각이 중복된 로직을 담아서는 안된다고 명시한다. 대신, 그 로직은 한번만 구현되어 이름을 얻고 여러번 적용되어야 한다. 만약 코드 블록을 복사해서 붙여넣기 하고 있다면, 그것은 함수 추상화를 적용할 기회를 찾은 것이다.
- 일반적으로 정의하기 : 함수는 일반적인 형태로 정의되어야 한다. 숫자를 제곱하는 함수가 파이썬 표준 라이브러리에 굳이 없는 이유는, 그것이 숫자를 임의의 거듭제곱으로 높이는 pow 함수의 특수한 사례에 불과하기 때문이다.
이러한 지침들은 코드의 가독성을 높이고, 오류의 수를 줄이며, 종종 작성되는 전체 코드의 양을 최소화한다. 복잡한 작업을 간결한 함수들로 분해하는 것은 숙달되기까지 경험이 필요한 기술이다. 다행히 파이썬은 우리의 이러한 노력을 뒷받침할 여러 기능을 제공한다.
Documentation
함수 정의에는 흔히 docstring이라 불리는 함수 설명 문서가 포함되며, 이는 함수 본문과 마찬가지로 들여쓰기를 해야한다. docstring은 관례적으로 세개의 따옴표를 사용한다.
첫번째 줄은 함수의 역할을 한줄로 설명하고, 이어지는 줄들은 인자에 대한 설명이나 함수의 동작을 상세히 기술할 수 있다.

함수의 이름을 인자로 하여 help 함수를 호출하면 해당 함수의 docstring을 볼 수 있다. (닫으려면 q)

파이썬 프로그램을 작성할 때는 아주 단순한 함수를 제외하고는 모두 docstring을 포함시키는 것이 좋다. 코드는 단 한 번 작성되지만, 읽히는 것은 여러번 이라는 사실을 기억해야 한다.
파이썬 공식 문서에는 다양한 파이썬 프로젝트 간의 일관성을 유지하기 위한 docstring 가이드라인이 포함되어 있다.
주석 (Comments)
파이썬에서 주석은 # 기호 뒤에 오는 내용으로, 줄 끝에 붙일 수 있다. 예를 들어 위 코드의 # 볼츠만 상수 라는 주석은 변수 K를 설명한다.
이러한 주석은 파이썬 help 결과에 절대 나타나지 않으며 인터프리터에 의해 무시된다. 주석은 오직 인간만을 위해 존자한다.
Default Argument Values
일반적임 함수를 정의하다 보면, 부수적으로 더 많은 인자가 도입되곤 한다. 인자가 너무 많은 함수는 호출하기가 번거롭고 읽기도 어려울 수 있다.
파이썬에서는 함수의 인자에 기본값을 제공할 수 있다. 함수를 호출 할 때, 기본값이 설정된 인자는 선택 사항이 된다. 인자가 전달되지 않으면 형식 매개변수 이름에 그 기본값이 대신 바인딩 된다.
예를 들어, 어떤 애플리케이션에서 보통 1몰의 입자에 대한 압력을 계산 한다면, 이 값을 기본값으로 제공할 수 있다.

이 예제에서 = 기호는 사용된 맥락에 따라 두 가지 서로 다른 의미를 갖는다. def 문의 헤더에서 = 는 할당을 수행하는 것이 아니라, pressure 함수가 호출될 때 사용할 기본값을 나타낸다. 반면, 함수 본문 내에서 k에 대한 할당문은 이름 k를 볼츠만 상수의 근사값에 바인딩한다.

pressure 함수는 세 개의 인자를 받도록 정의되어 있지만, 위 첫 번째 호출 표현식에서는 두 개의 인자만 전달되었다. 이 경우 n의 값은 def 문에 명시된 기본값에서 가져온다. 만약 세 번째 인가자 제공되면, 기본값은 무시된다.
하나의 지침으로서, 함수 본문에서 사용되는 대부분의 데이터 값은 이름을 가진 인자의 기본값으로 표현하는 것이 좋다. 그래야 검사하기 쉽고, 함수 호출자가 값을 변경하기도 용이하기 때문이다. 다만 물리 상수 k와 같이 절대 변하지 않는 일부 값들은 함수 본문이나 전역 프레임에 바인딩 할 수 있다.