[Fluent Python] 5장 일급 함수

5장 일급 함수

“일급 객체로서의 함수”를 줄여서 “일급 함수”라고 한다.

일급 객체는 다음과 같이 정의한다.

고위함수(Higher-order function)

고위함수: 함수를 인수로 받거나, 함수를 결과로 반환하는 함수

apply()는 파이썬 2.3에서 중단이 예고되고, 파이썬3에서 제거되었다. apply(fn, args, kwargs) 대신 fn(*args, **kwargs)로 작성하면 된다.

map(), filter(), reduce() 는 지능형 리스트나 제너레이터로 표현가능하고, 후자가 가독성이 더 좋다.

익명함수인 람다는 고위함수의 인수로 주로 이용된다. 그 외에는 가독성이 떨어져서 잘 쓰이지 않는다. 람다 본체에는 할당문이나 while, try 등을 사용할 수 없다.

콜러블 객체

콜러블 객체는 내장함수인 callable()로 평가할 수 있다. 파이썬 데이터 모델 문서에 다음 일곱 가지 콜러블을 제시하고 있다.

함수 인트로스펙션

객체 속성을 검사할 수 있다. 다음과 같은 코드로 함수와 일반 객체와 달리 추가적으로 가지고 있는 속성을 확인할 수 있다.

>>> class C: pass
>>> obj = C()
>>> def func(): pass
>>> sorted(set(dir(func)) - set(dir(obj)))

위치매개 변수와 키워드 전용 매개변수: 함수에서 * 혹은 **를 이용해서 다수의 매개변수를 받을 수 있다.

inspect 모듈을 이용하면 좀 더 깔끔하게 매개변수를 알아내고 이용할 수 있다. signature 함수가 있다.

함수 애너테이션

함수 매개변수 뒤에 콜론(:)을 붙여서 애너테이션 표현식을 추가할 수 있다. 그리고 함수 괄호와 콜론 사이에 ->를 추가하여 리턴형을 써줄 수 있다. 하지면 현 시점에는 이들 정보는 메타 정보로만 저장될 뿐이고, 이 메타 정보를 활용하는 표준 라이브러리는 없다. 향후 형변환을 하거나, 인수를 변환하고 검증(예를 들어, > 0)할 때, 이용할 수 있다.

함수형 프로그래밍을 위한 패키지

operator와 functools를 이용하여 함수형 코딩 스타일을 이용할 수 있다.

reduce()함수를 이용하여, reduce(mul, range(1, n+1))로 팩토리얼을 구현할 수 있다.

itemgetter()attrgetter() 함수를 이용하여 람다함수를 대체할 수 있다. itemgetter(1)lamda fields: fields[1]과 동일하다.

methodcaller()는 런타임에 함수를 생성할 수 있는데, functools.partial()함수와 유사하게 일부 인수를 고정할 수 있다.

더 읽을거리