5. 일급 함수

 

Remarks

이 글은 전문가를 위한 파이썬(Fluent Python)을 정리한 자료입니다.


일급 객체
다음과 같은 작업을 수행할 수 있는 프로그램 개체

  • Runtime에 생성할 수 있음
  • 데이터 구조체의 변수나 요소에 할당할 수 있음
  • 함수 인수/결과로 전달할 수 있음

5.1 함수를 객체처럼 다루기

  • 객체의 도움말 텍스트
    __doc__
    def factorial(n):
      '''returns n!'''  # __doc__
      return ...
    
>>> factorial.__doc__
'returns n!'

>>> help(factorial)
...

5.2 고위 함수

고위 함수(higher-order function)
함수를 인자로 받거나, 함수를 결과로 반환하는 함수

5.5 사용자 정의 콜러블형

class BingoCage:
  ...

  def __call__(self):
    return self.pick()   
>>> bingo = BingoCage()
>>> bingo()  # bingo.__call__()

5.7 위치 매개변수에서 키워드 전용 매개변수까지

def f(a, b, *, c):
  return a, b, c
>>> f(1)
TypeError: f() takes 2 positional arguments but 1 were given

>>> f(1, 2)
TypeError: f() missing 1 required keyword-only argument: 'c'

>>> f(1, 2, 3)
TypeError: f() takes 2 positional arguments but 3 were given

>>> f(1, 2, c=3)
1, 2, 3

5.9 함수 애너테이션

def clip(text: str, max_len: 'int > 0'=80) -> str:
  ...
  • 애너테이션은 전혀 처리되지 않으며, 단지 함수 객체 안의 dict형 __annotations__ 속성에 저장될 뿐이다
  • 애너테이션을 추출하기 위해, inspect.signature()를 사용

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

5.10.1 operator 모듈

from functools import reduce
from operator import mul

def fact(n):
  # return reduce(lambda a, b: a*b, range(1, n+1))
  return reduce(mul,              range(1, n+1))
  • operator.itemgetter
    • itemgetter(1): lambda fields: fields[1]
    • [] 연산자를 사용하므로 mapping, __getitem__()을 사용하는 모든 클래스를 지원
from operator import itemgetter

datas = [
  (1, 'a', 'A', ...),
  ...
  (2, 'b', 'B', ...)
]

for data in sorted(datas, key=itemgetter(1)):
  print(data)
  • operator.attrgetter, operator.methodcaller도 존재하나 굳이 쓸 일이 있을까 싶다..

5.10.2 functools.partial()로 인수 고정하기

functools.partial(): 원래 함수의 일부 인수를 고정한 콜러블을 생성

  • partial()의 첫 번째 인수는 callable, 이후로는 바인딩할 위치 인수와 키워드 인수가 들어감
  • lambda와 partial을 비교: https://wikidocs.net/13973